diff --git a/env/env.development b/env/env.development index db61ef4..2020ed0 100644 --- a/env/env.development +++ b/env/env.development @@ -22,10 +22,10 @@ CRON_MIDNIGHT="55 11 * * *" CRON_EVERY_MINUTE="55 11 * * *" CRON_EVERY_HOUR="0 * * * *" -EMAIL_HOST="sandbox.smtp.mailtrap.io" +EMAIL_HOST=smtp.gmail.com EMAIL_POST=465 -EMAIL_USER="developer@eigen.co.id" -EMAIL_TOKEN="bitqkbkzjzfywxqx" +EMAIL_USER=developer@eigen.co.id +EMAIL_TOKEN=bitqkbkzjzfywxqx MIDTRANS_URL=https://app.sandbox.midtrans.com MIDTRANS_PRODUCTION=false @@ -33,4 +33,7 @@ MIDTRANS_SERVER_KEY= MIDTRANS_CLIENT_KEY= EXPORT_LIMIT_PARTITION=200 -ASSETS="https://asset.sky.eigen.co.id/" \ No newline at end of file +ASSETS="https://asset.sky.eigen.co.id/" + +GOOGLE_CALENDAR_KEY="AIzaSyCSg4P3uC9Z7kD1P4f3rf1BbBaz4Q-M55o" +GOOGLE_CALENDAR_ID="" \ No newline at end of file diff --git a/env/env.production b/env/env.production index b389dbc..9a36e4f 100644 --- a/env/env.production +++ b/env/env.production @@ -22,10 +22,10 @@ CRON_MIDNIGHT="55 11 * * *" CRON_EVERY_MINUTE="55 11 * * *" CRON_EVERY_HOUR="0 * * * *" -EMAIL_HOST="sandbox.smtp.mailtrap.io" +EMAIL_HOST=smtp.gmail.com EMAIL_POST=465 -EMAIL_USER= -EMAIL_TOKEN= +EMAIL_USER=weplayground.app@gmail.com +EMAIL_TOKEN=sonvvwiukhsevtmv MIDTRANS_URL=https://app.midtrans.com MIDTRANS_PRODUCTION=true @@ -33,4 +33,7 @@ MIDTRANS_SERVER_KEY= MIDTRANS_CLIENT_KEY= EXPORT_LIMIT_PARTITION=200 -ASSETS="https://asset.sky.eigen.co.id/" \ No newline at end of file +ASSETS="https://asset.sky.eigen.co.id/" + +GOOGLE_CALENDAR_KEY="AIzaSyCSg4P3uC9Z7kD1P4f3rf1BbBaz4Q-M55o" +GOOGLE_CALENDAR_ID="" \ No newline at end of file diff --git a/google-credential.json b/google-credential.json new file mode 100644 index 0000000..2ba7c21 --- /dev/null +++ b/google-credential.json @@ -0,0 +1,13 @@ +{ + "type": "service_account", + "project_id": "weplayground-app", + "private_key_id": "e3ed1a4430140ac589c6e9e7ce125d16d8f7304a", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDCmEl90K7ojdx1\nnJv5BKq3THI+l+pgC4dlqOuEV4sc2SFXECgyEgEYAFH6U8eH9TTl5wW5hFhvpiWl\nHSxZA2nMa1ojp97mkufzaGgsJbcB4ni9ydoJyN9Hqs2Wz+JiBtjscGOrmOP1bNyn\nBO9RhHInh0bfTNMrtsIicr4DPNIfM2sl95v6pCDGt7Cfu2NoEnDhId50d73KVONI\n0+rf90WhehEMwoZEzYI0gLmSVbnPEm1j4/OOQfQl7FjaFKyle+A5BWaiRsIqiSue\n0jvZz0DlGmjeHx1yjBIKpq5omOku7aYi4kTNEZKKxzs5HhRFKi2KuYNK/WD5ApQg\ncIhGhhCfAgMBAAECggEANX+LmNjh9VJm/Tigkt4LFxifwgCe8WfKAhNmKHyu5K/3\nIAnzmwxjG5ee8gzNat3pfJk+dCnj7FIHwHScSB6NnCMZZXsV51sVBNC77wMxZIXA\nPyE63fzJEdlt6xvc96k9QweFB1yhs0wJ/6r2JnmcrqxcujBTUA3PIoxcG+TBOc08\ndo5Rcbeq6/3txjGlFM1820WViuFSQQiL6PgNVb+l0JrQ8rAOflKYFOkUb8wux9LX\nnD4vJMwa0j+GRvH5BCcZCguIQZn2JR3rTgcavWtcaHiTNsc49Lsj/hGGOsbkFROo\nGWaSgXE169xiVR/MMEblzqpSXq1qXF2iUeaqyUFIZQKBgQDxxrNlDs1qMfcaQ0S2\nVVtU/f1NfY+kCjQaC4CoYJaaoZINs5ODPs8/2DGnHuhNXMtnPeQ+SzNaK1e1eLbw\nmvq1+n3aGZTvUq2L3b+v7JJ6TQmQ4eBLZBzNjxrxC3EkCULTuROtsAhfzORuE0mE\nwnhR5LpPraEBrPi0re9yDDXVHQKBgQDOCwGw1gNVLh622qR65Zhx5rs2q6ktPxq2\neiUV0KDug6/7QbJzg1pNeoVQmadJR86H0fzKMsN5C7t7z3MIkqXc0+T1NmdN2fPm\ndLthnR1grCDYykoet/CITbAfiip27/o3TJ7YIYItefyZ4GnNH82R/4z3LBDnXB9f\n565hbUj76wKBgEnNMpOFijSBXgFZSU8zDPcLtNeDnWYgazkMC9DZ8v7ulOuzxjKI\n6LB/aOCvsY9z5O712IcfY2SB2HsfhxA47pDADsyVhH3tSeZo4QttdmT4wRPFrza0\nL4qbxUiRCo9KeGiylQwusM+1doEXSBjLV/j/jdOml4AwcZaNhYrVqVUNAoGAU0uD\nzXdXNZJFfGp7X+t9a155hKp05APEyswqPd1vkbzO4eY3PBd35CaJyoGzbR6IUcQE\nS8Gl4ENr8at1t5uBTfqjbrYloQVhYmMCdX3MqI4tYTa2LCD0LkYp0zZJ4Hc3Ui+5\nb2psc/ICujpMy032DvWeiTXZR46oaF8C0gQaIy0CgYEAmKCP4CXmPlWoWqebFp3W\nz2eKWUfASioQ+ZGUVNEge4a6iutciydQJZxBfg9ZXWqDfI0FoRSPfs2zUZFO0AcM\n6oaPGiFnTnH8FGcSHu3p0YysevyoSY6tgsAhb3IiKjJd4e7btsYzpPZbIfyfUVHK\nQFOOSkE+x4J5ts+XO6isQ+w=\n-----END PRIVATE KEY-----\n", + "client_email": "weplayground@weplayground-app.iam.gserviceaccount.com", + "client_id": "106351339097550564510", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/weplayground%40weplayground-app.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" +} diff --git a/src/core/modules/domain/usecase/managers/base-update.manager.ts b/src/core/modules/domain/usecase/managers/base-update.manager.ts index 29468e0..b681cc2 100644 --- a/src/core/modules/domain/usecase/managers/base-update.manager.ts +++ b/src/core/modules/domain/usecase/managers/base-update.manager.ts @@ -102,7 +102,7 @@ export abstract class BaseUpdateManager extends BaseManager { this.eventBus.publishAll([ new topic.topic({ - id: data?.['id'] ?? topic?.data?.['id'], + id: topic.data?.['id'] ?? this.dataId, old: this.oldData, data: data ?? topic.data, user: this.user, diff --git a/src/database/migrations/1721892389807-add-calendar-column-transaction.ts b/src/database/migrations/1721892389807-add-calendar-column-transaction.ts new file mode 100644 index 0000000..fbd387d --- /dev/null +++ b/src/database/migrations/1721892389807-add-calendar-column-transaction.ts @@ -0,0 +1,25 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddCalendarColumnTransaction1721892389807 + implements MigrationInterface +{ + name = 'AddCalendarColumnTransaction1721892389807'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "transactions" ADD "calendar_id" character varying`, + ); + await queryRunner.query( + `ALTER TABLE "transactions" ADD "calendar_link" character varying`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "transactions" DROP COLUMN "calendar_id"`, + ); + await queryRunner.query( + `ALTER TABLE "transactions" DROP COLUMN "calendar_link"`, + ); + } +} diff --git a/src/modules/configuration/google-calendar/domain/usecases/managers/helpers/create-event-calanedar.helper.ts b/src/modules/configuration/google-calendar/domain/usecases/managers/helpers/create-event-calanedar.helper.ts new file mode 100644 index 0000000..14e35d4 --- /dev/null +++ b/src/modules/configuration/google-calendar/domain/usecases/managers/helpers/create-event-calanedar.helper.ts @@ -0,0 +1,78 @@ +import { google } from 'googleapis'; +import * as fs from 'fs'; +import * as path from 'path'; +import { TransactionEntity } from 'src/modules/transaction/transaction/domain/entities/transaction.entity'; + +export async function CreateEventCalendarHelper( + transaction: TransactionEntity, + isDelete = false, +) { + let result; + + const filePath = path.join( + __dirname, + '../../../../../../../../', + 'google-credential.json', + ); + const credential = JSON.parse(fs.readFileSync(filePath, 'utf8')); + + const client = new google.auth.JWT({ + email: credential.client_email, + key: credential.private_key, + scopes: ['https://www.googleapis.com/auth/calendar'], + }); + + const calendar = google.calendar({ + version: 'v3', + auth: client, + }); + + const eventData = mappingData(transaction); + + if (transaction.calendar_id) { + result = await calendar.events.update( + { + calendarId: process.env.GOOGLE_CALENDAR_ID, + eventId: transaction.calendar_id, + requestBody: eventData, + }, + {}, + ); + } else if (!isDelete) { + result = await calendar.events.insert( + { + calendarId: process.env.GOOGLE_CALENDAR_ID, + requestBody: eventData, + }, + {}, + ); + } else { + result = await calendar.events.delete( + { + calendarId: process.env.GOOGLE_CALENDAR_ID, + eventId: transaction.calendar_id, + }, + {}, + ); + } + + return result?.data; +} + +function mappingData(transaction) { + return { + summary: transaction.invoice_code, + description: `Booking for invoice ${transaction.invoice_code}`, + start: { + dateTime: new Date(transaction.booking_date).toISOString(), + timeZone: 'Asia/Jakarta', + }, + end: { + dateTime: new Date(transaction.booking_date).toISOString(), + timeZone: 'Asia/Jakarta', + }, + reminders: { + useDefault: false, + }, + }; +} diff --git a/src/modules/configuration/google-calendar/domain/usecases/managers/index-holiday-google-calendar.manager.ts b/src/modules/configuration/google-calendar/domain/usecases/managers/index-holiday-google-calendar.manager.ts index 6124380..d3c4454 100644 --- a/src/modules/configuration/google-calendar/domain/usecases/managers/index-holiday-google-calendar.manager.ts +++ b/src/modules/configuration/google-calendar/domain/usecases/managers/index-holiday-google-calendar.manager.ts @@ -8,7 +8,7 @@ export class IndexHolidayCalendarManager { const events = []; const calendar = google.calendar({ version: 'v3', - auth: 'AIzaSyCsCt6PDd6uYLkahvtdvCoMWf-1_QaLiNM', + auth: process.env.GOOGLE_CALENDAR_KEY, }); const calendarId = 'id.indonesian#holiday@group.v.calendar.google.com'; diff --git a/src/modules/configuration/google-calendar/google-calendar.module.ts b/src/modules/configuration/google-calendar/google-calendar.module.ts index e3659cc..24fde4b 100644 --- a/src/modules/configuration/google-calendar/google-calendar.module.ts +++ b/src/modules/configuration/google-calendar/google-calendar.module.ts @@ -4,10 +4,29 @@ import { CqrsModule } from '@nestjs/cqrs'; import { IndexHolidayCalendarManager } from '../../configuration/google-calendar/domain/usecases/managers/index-holiday-google-calendar.manager'; import { GoogleCalendarController } from './infrastructure/google-calendar.controller'; import { GoogleCalendarOrchestrator } from './domain/usecases/google-calendar.orchestrator'; +import { TransactionDataService } from 'src/modules/transaction/transaction/data/services/transaction-data.service'; +import { TransactionModel } from 'src/modules/transaction/transaction/data/models/transaction.model'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; +import { TransactionItemModel } from 'src/modules/transaction/transaction/data/models/transaction-item.model'; +import { TransactionTaxModel } from 'src/modules/transaction/transaction/data/models/transaction-tax.model'; @Module({ - imports: [ConfigModule.forRoot(), CqrsModule], + imports: [ + ConfigModule.forRoot(), + TypeOrmModule.forFeature( + [TransactionModel, TransactionItemModel, TransactionTaxModel], + CONNECTION_NAME.DEFAULT, + ), + CqrsModule, + ], controllers: [GoogleCalendarController], - providers: [IndexHolidayCalendarManager, GoogleCalendarOrchestrator], + providers: [ + IndexHolidayCalendarManager, + + TransactionDataService, + + GoogleCalendarOrchestrator, + ], }) export class GoogleCalendarModule {} diff --git a/src/modules/configuration/google-calendar/infrastructure/google-calendar.controller.ts b/src/modules/configuration/google-calendar/infrastructure/google-calendar.controller.ts index e8c8b6b..500609f 100644 --- a/src/modules/configuration/google-calendar/infrastructure/google-calendar.controller.ts +++ b/src/modules/configuration/google-calendar/infrastructure/google-calendar.controller.ts @@ -1,5 +1,5 @@ import { GoogleCalendarOrchestrator } from './../domain/usecases/google-calendar.orchestrator'; -import { Controller, Get, Query } from '@nestjs/common'; +import { Controller, Get, Post, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { Public } from 'src/core/guards'; import { FilterGoogleCalendarDto } from './dto/filter-google-calendar.dto'; diff --git a/src/modules/transaction/reconciliation/domain/usecases/managers/batch-cancel-reconciliation.manager.ts b/src/modules/transaction/reconciliation/domain/usecases/managers/batch-cancel-reconciliation.manager.ts index 5db3089..44e87ff 100644 --- a/src/modules/transaction/reconciliation/domain/usecases/managers/batch-cancel-reconciliation.manager.ts +++ b/src/modules/transaction/reconciliation/domain/usecases/managers/batch-cancel-reconciliation.manager.ts @@ -12,6 +12,7 @@ import { import { TransactionEntity } from 'src/modules/transaction/transaction/domain/entities/transaction.entity'; import { TransactionModel } from 'src/modules/transaction/transaction/data/models/transaction.model'; import { STATUS } from 'src/core/strings/constants/base.constants'; +import { TransactionChangeStatusEvent } from 'src/modules/transaction/transaction/domain/entities/event/transaction-change-status.event'; @Injectable() export class BatchCancelReconciliationManager extends BaseBatchUpdateStatusManager { @@ -67,7 +68,11 @@ export class BatchCancelReconciliationManager extends BaseBatchUpdateStatusManag } get eventTopics(): EventTopics[] { - return []; + return [ + { + topic: TransactionChangeStatusEvent, + }, + ]; } getResult(): BatchResult { diff --git a/src/modules/transaction/reconciliation/domain/usecases/managers/batch-confirm-reconciliation.manager.ts b/src/modules/transaction/reconciliation/domain/usecases/managers/batch-confirm-reconciliation.manager.ts index 4adec65..3f3df81 100644 --- a/src/modules/transaction/reconciliation/domain/usecases/managers/batch-confirm-reconciliation.manager.ts +++ b/src/modules/transaction/reconciliation/domain/usecases/managers/batch-confirm-reconciliation.manager.ts @@ -8,6 +8,7 @@ import { Injectable } from '@nestjs/common'; import { TransactionEntity } from 'src/modules/transaction/transaction/domain/entities/transaction.entity'; import { TransactionModel } from 'src/modules/transaction/transaction/data/models/transaction.model'; import { STATUS } from 'src/core/strings/constants/base.constants'; +import { TransactionChangeStatusEvent } from 'src/modules/transaction/transaction/domain/entities/event/transaction-change-status.event'; @Injectable() export class BatchConfirmReconciliationManager extends BaseBatchUpdateStatusManager { @@ -45,7 +46,11 @@ export class BatchConfirmReconciliationManager extends BaseBatchUpdateStatusMana } get eventTopics(): EventTopics[] { - return []; + return [ + { + topic: TransactionChangeStatusEvent, + }, + ]; } getResult(): BatchResult { diff --git a/src/modules/transaction/reconciliation/domain/usecases/managers/cancel-reconciliation.manager.ts b/src/modules/transaction/reconciliation/domain/usecases/managers/cancel-reconciliation.manager.ts index fb48668..7550736 100644 --- a/src/modules/transaction/reconciliation/domain/usecases/managers/cancel-reconciliation.manager.ts +++ b/src/modules/transaction/reconciliation/domain/usecases/managers/cancel-reconciliation.manager.ts @@ -10,6 +10,7 @@ import { validateRelations, } from 'src/core/strings/constants/interface.constants'; import { TransactionModel } from 'src/modules/transaction/transaction/data/models/transaction.model'; +import { TransactionChangeStatusEvent } from 'src/modules/transaction/transaction/domain/entities/event/transaction-change-status.event'; import { TransactionEntity } from 'src/modules/transaction/transaction/domain/entities/transaction.entity'; @Injectable() @@ -68,6 +69,10 @@ export class CancelReconciliationManager extends BaseUpdateStatusManager TransactionItemModel, (model) => model.transaction, { cascade: true, diff --git a/src/modules/transaction/transaction/domain/entities/transaction.entity.ts b/src/modules/transaction/transaction/domain/entities/transaction.entity.ts index 09f1f54..2f3fcec 100644 --- a/src/modules/transaction/transaction/domain/entities/transaction.entity.ts +++ b/src/modules/transaction/transaction/domain/entities/transaction.entity.ts @@ -78,4 +78,7 @@ export interface TransactionEntity extends BaseStatusEntity { sending_invoice_status: STATUS; sending_qr_at: number; sending_qr_status: STATUS; + + calendar_id?: string; + calendar_link?: string; } diff --git a/src/modules/transaction/transaction/domain/usecases/handlers/midtrans-transaction-callback.handler.ts b/src/modules/transaction/transaction/domain/usecases/handlers/midtrans-transaction-callback.handler.ts index ec0d46b..48ab93f 100644 --- a/src/modules/transaction/transaction/domain/usecases/handlers/midtrans-transaction-callback.handler.ts +++ b/src/modules/transaction/transaction/domain/usecases/handlers/midtrans-transaction-callback.handler.ts @@ -1,23 +1,36 @@ -import { EventsHandler, IEventHandler } from '@nestjs/cqrs'; +import { EventBus, EventsHandler, IEventHandler } from '@nestjs/cqrs'; import { MidtransCallbackEvent } from 'src/modules/configuration/midtrans/domain/entities/midtrans-callback.event'; import { TransactionDataService } from '../../../data/services/transaction-data.service'; import { TransactionModel } from '../../../data/models/transaction.model'; -import { STATUS } from 'src/core/strings/constants/base.constants'; +import { + BLANK_USER, + OPERATION, + STATUS, +} from 'src/core/strings/constants/base.constants'; +import { TransactionChangeStatusEvent } from '../../entities/event/transaction-change-status.event'; +import * as _ from 'lodash'; +import { TABLE_NAME } from 'src/core/strings/constants/table.constants'; @EventsHandler(MidtransCallbackEvent) export class MidtransCallbackHandler implements IEventHandler { - constructor(private dataService: TransactionDataService) {} + constructor( + private dataService: TransactionDataService, + private eventBus: EventBus, + ) {} async handle(event: MidtransCallbackEvent) { const data_id = event.data.id; const data = event.data.data; + let old_data; + const transaction = await this.dataService.getOneByOptions({ where: { id: data_id, }, }); + old_data = _.cloneDeep(transaction); if (['capture', 'settlement'].includes(data.transaction_status)) { Object.assign(transaction, { @@ -40,5 +53,17 @@ export class MidtransCallbackHandler .manager.connection.createQueryRunner(); await this.dataService.create(queryRunner, TransactionModel, transaction); + + this.eventBus.publish( + new TransactionChangeStatusEvent({ + id: data_id, + old: old_data, + data: data, + user: BLANK_USER, + description: 'Midtrans Callback', + module: TABLE_NAME.TRANSACTION, + op: OPERATION.UPDATE, + }), + ); } } diff --git a/src/modules/transaction/transaction/domain/usecases/handlers/settled-transaction.handler.ts b/src/modules/transaction/transaction/domain/usecases/handlers/settled-transaction.handler.ts index f26b6b5..827d347 100644 --- a/src/modules/transaction/transaction/domain/usecases/handlers/settled-transaction.handler.ts +++ b/src/modules/transaction/transaction/domain/usecases/handlers/settled-transaction.handler.ts @@ -7,8 +7,10 @@ import { STATUS } from 'src/core/strings/constants/base.constants'; import { TransactionDataService } from '../../../data/services/transaction-data.service'; import { TransactionModel } from '../../../data/models/transaction.model'; import { calculateSalesFormula } from 'src/modules/transaction/sales-price-formula/domain/usecases/managers/helpers/calculation-formula.helper'; +import { CreateEventCalendarHelper } from 'src/modules/configuration/google-calendar/domain/usecases/managers/helpers/create-event-calanedar.helper'; +import { TransactionUpdatedEvent } from '../../entities/event/transaction-updated.event'; -@EventsHandler(TransactionChangeStatusEvent) +@EventsHandler(TransactionChangeStatusEvent, TransactionUpdatedEvent) export class SettledTransactionHandler implements IEventHandler { @@ -21,55 +23,70 @@ export class SettledTransactionHandler async handle(event: TransactionChangeStatusEvent) { const old_data = event.data.old; const current_data = event.data.data; - - if ( - old_data.status == current_data.status || - ![STATUS.ACTIVE, STATUS.SETTLED].includes(current_data.status) - ) - return; + const settled = [STATUS.ACTIVE, STATUS.SETTLED].includes( + current_data.status, + ); + const oldSettled = [STATUS.ACTIVE, STATUS.SETTLED].includes( + old_data.status, + ); const data = await this.dataService.getOneByOptions({ where: { - id: current_data.id, + id: event.data.id, }, relations: ['items'], }); - const profit_formula = await this.formulaService.getOneByOptions({ - where: { - type: FormulaType.PROFIT_SHARE, - }, - }); - - const sales_price = await this.formulaService.getOneByOptions({ - where: { - type: FormulaType.SALES_PRICE, - }, - }); - - const taxes = await this.taxService.getManyByOptions({ - where: { - status: STATUS.ACTIVE, - }, - }); + if (!settled || !oldSettled) return; const queryRunner = this.dataService .getRepository() .manager.connection.createQueryRunner(); - // const profit_share_value = this.calculateFormula(profit_formula.formula_string, taxes, data.payment_total_net_profit ?? 0); - const { dpp_value, tax_datas } = calculateSalesFormula( - sales_price.formula_string, - taxes, - data.payment_total_net_profit ?? 0, - ); + if (settled) { + const profit_formula = await this.formulaService.getOneByOptions({ + where: { + type: FormulaType.PROFIT_SHARE, + }, + }); - Object.assign(data, { - payment_total_dpp: dpp_value, - profit_share_formula: profit_formula.formula_string, - sales_price_formula: sales_price.formula_string, - taxes: tax_datas, - }); + const sales_price = await this.formulaService.getOneByOptions({ + where: { + type: FormulaType.SALES_PRICE, + }, + }); + + const taxes = await this.taxService.getManyByOptions({ + where: { + status: STATUS.ACTIVE, + }, + }); + + // const profit_share_value = this.calculateFormula(profit_formula.formula_string, taxes, data.payment_total_net_profit ?? 0); + const { dpp_value, tax_datas } = calculateSalesFormula( + sales_price.formula_string, + taxes, + data.payment_total_net_profit ?? 0, + ); + + const google_calendar = await CreateEventCalendarHelper(data); + + Object.assign(data, { + payment_total_dpp: dpp_value, + profit_share_formula: profit_formula.formula_string, + sales_price_formula: sales_price.formula_string, + taxes: tax_datas, + calendar_id: google_calendar?.id, + calendar_link: google_calendar?.htmlLink, + }); + } else if (oldSettled) { + const google_calendar = await CreateEventCalendarHelper(data); + + Object.assign(data, { + calendar_id: null, + calendar_link: null, + }); + } await this.dataService.create(queryRunner, TransactionModel, data); }