diff --git a/packages/server/src/common/decorators/Validators.ts b/packages/server/src/common/decorators/Validators.ts new file mode 100644 index 000000000..acb2266a1 --- /dev/null +++ b/packages/server/src/common/decorators/Validators.ts @@ -0,0 +1,32 @@ +import { Transform } from 'class-transformer'; +import { ValidateIf, ValidationOptions } from 'class-validator'; + +/** + * Decorator that converts the property value to a number. + * @returns PropertyDecorator + */ +export function ToNumber() { + return Transform(({ value, key }) => { + const defaultValue = null; + + if (typeof value === 'number') { + return value; + } + // If value is an empty string or undefined/null, return it as-is (won’t pass validation) + if (value === '' || value === null || value === undefined) { + return defaultValue; + } + const parsed = Number(value); + return !isNaN(parsed) ? parsed : value; + }); +} + +/** + * Validates if the property is not empty. + * @returns PropertyDecorator + */ +export function IsOptional(validationOptions?: ValidationOptions) { + return ValidateIf((_obj, value) => { + return value !== null && value !== undefined && value !== ''; + }, validationOptions); +} diff --git a/packages/server/src/i18n/en/warehouses.json b/packages/server/src/i18n/en/warehouses.json new file mode 100644 index 000000000..d5a54ac49 --- /dev/null +++ b/packages/server/src/i18n/en/warehouses.json @@ -0,0 +1,4 @@ +{ + "primary_warehouse": "Primary Warehouse" +} + diff --git a/packages/server/src/modules/Branches/Branches.controller.ts b/packages/server/src/modules/Branches/Branches.controller.ts index 81e2fc9fe..294081c47 100644 --- a/packages/server/src/modules/Branches/Branches.controller.ts +++ b/packages/server/src/modules/Branches/Branches.controller.ts @@ -76,8 +76,13 @@ export class BranchesController { status: 200, description: 'The branches feature has been successfully activated.', }) - activateBranches() { - return this.branchesApplication.activateBranches(); + async activateBranches() { + await this.branchesApplication.activateBranches(); + + return { + code: 200, + message: 'The branches activated successfully.', + }; } @Put(':id/mark-as-primary') diff --git a/packages/server/src/modules/Branches/BranchesSettings.ts b/packages/server/src/modules/Branches/BranchesSettings.ts index 88f88888a..afba0e209 100644 --- a/packages/server/src/modules/Branches/BranchesSettings.ts +++ b/packages/server/src/modules/Branches/BranchesSettings.ts @@ -17,6 +17,8 @@ export class BranchesSettingsService { const settingsStore = await this.settingsStore(); settingsStore.set({ group: 'features', key: Features.BRANCHES, value: 1 }); + + await settingsStore.save(); }; /** diff --git a/packages/server/src/modules/Branches/dtos/Branch.dto.ts b/packages/server/src/modules/Branches/dtos/Branch.dto.ts index 732745b66..77e299772 100644 --- a/packages/server/src/modules/Branches/dtos/Branch.dto.ts +++ b/packages/server/src/modules/Branches/dtos/Branch.dto.ts @@ -1,9 +1,9 @@ +import { IsOptional } from '@/common/decorators/Validators'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsBoolean, IsEmail, IsNotEmpty, - IsOptional, IsString, IsUrl, } from 'class-validator'; diff --git a/packages/server/src/modules/Currencies/Currencies.controller.ts b/packages/server/src/modules/Currencies/Currencies.controller.ts index 5c4ae9127..6231b6ee3 100644 --- a/packages/server/src/modules/Currencies/Currencies.controller.ts +++ b/packages/server/src/modules/Currencies/Currencies.controller.ts @@ -37,15 +37,15 @@ export class CurrenciesController { return this.currenciesApp.createCurrency(dto); } - @Put(':code') + @Put(':id') @ApiOperation({ summary: 'Edit an existing currency' }) @ApiParam({ name: 'id', type: Number, description: 'Currency ID' }) @ApiBody({ type: EditCurrencyDto }) @ApiOkResponse({ description: 'The currency has been successfully updated.' }) @ApiNotFoundResponse({ description: 'Currency not found.' }) @ApiBadRequestResponse({ description: 'Invalid input data.' }) - edit(@Param('code') code: string, @Body() dto: EditCurrencyDto) { - return this.currenciesApp.editCurrency(code, dto); + edit(@Param('id') id: number, @Body() dto: EditCurrencyDto) { + return this.currenciesApp.editCurrency(id, dto); } @Delete(':code') diff --git a/packages/server/src/modules/Currencies/CurrenciesApplication.service.ts b/packages/server/src/modules/Currencies/CurrenciesApplication.service.ts index a981a2f7b..cb40cad48 100644 --- a/packages/server/src/modules/Currencies/CurrenciesApplication.service.ts +++ b/packages/server/src/modules/Currencies/CurrenciesApplication.service.ts @@ -27,8 +27,8 @@ export class CurrenciesApplication { /** * Edits an existing currency. */ - public editCurrency(currencyCode: string, currencyDTO: EditCurrencyDto) { - return this.editCurrencyService.editCurrency(currencyCode, currencyDTO); + public editCurrency(currencyId: number, currencyDTO: EditCurrencyDto) { + return this.editCurrencyService.editCurrency(currencyId, currencyDTO); } /** diff --git a/packages/server/src/modules/Currencies/commands/EditCurrency.service.ts b/packages/server/src/modules/Currencies/commands/EditCurrency.service.ts index 1c35b7d33..eac211f52 100644 --- a/packages/server/src/modules/Currencies/commands/EditCurrency.service.ts +++ b/packages/server/src/modules/Currencies/commands/EditCurrency.service.ts @@ -12,21 +12,22 @@ export class EditCurrencyService { /** * Edit details of the given currency. - * @param {number} currencyCode - Currency code. + * @param {number} currencyId - Currency ID. * @param {ICurrencyDTO} currencyDTO - Edit currency dto. */ public async editCurrency( - currencyCode: string, + currencyId: number, currencyDTO: EditCurrencyDto, ): Promise { - const foundCurrency = await this.currencyModel() + const foundCurrency = this.currencyModel() .query() - .findOne('currencyCode', currencyCode) + .findById(currencyId) .throwIfNotFound(); + // Directly use the provided ID to update the currency const currency = await this.currencyModel() .query() - .patchAndFetchById(foundCurrency.id, { + .patchAndFetchById(currencyId, { ...currencyDTO, }); return currency; diff --git a/packages/server/src/modules/Currencies/dtos/CreateCurrency.dto.ts b/packages/server/src/modules/Currencies/dtos/CreateCurrency.dto.ts index 7d85e1ab2..fb4f37fd4 100644 --- a/packages/server/src/modules/Currencies/dtos/CreateCurrency.dto.ts +++ b/packages/server/src/modules/Currencies/dtos/CreateCurrency.dto.ts @@ -1,12 +1,16 @@ -import { IsString } from 'class-validator'; +import { IsNotEmpty } from "class-validator"; +import { IsString } from "class-validator"; export class CreateCurrencyDto { @IsString() + @IsNotEmpty() currencyName: string; @IsString() + @IsNotEmpty() currencyCode: string; @IsString() + @IsNotEmpty() currencySign: string; } diff --git a/packages/server/src/modules/Currencies/dtos/EditCurrency.dto.ts b/packages/server/src/modules/Currencies/dtos/EditCurrency.dto.ts index b49d1b58e..9179aeb7b 100644 --- a/packages/server/src/modules/Currencies/dtos/EditCurrency.dto.ts +++ b/packages/server/src/modules/Currencies/dtos/EditCurrency.dto.ts @@ -1,9 +1,12 @@ -import { IsString } from 'class-validator'; +import { IsNotEmpty } from "class-validator"; +import { IsString } from "class-validator"; export class EditCurrencyDto { @IsString() + @IsNotEmpty() currencyName: string; @IsString() + @IsNotEmpty() currencySign: string; } diff --git a/packages/server/src/modules/Items/dtos/Item.dto.ts b/packages/server/src/modules/Items/dtos/Item.dto.ts index 9df366807..332daabfd 100644 --- a/packages/server/src/modules/Items/dtos/Item.dto.ts +++ b/packages/server/src/modules/Items/dtos/Item.dto.ts @@ -1,7 +1,6 @@ import { IsString, IsIn, - IsOptional, IsBoolean, IsNumber, IsInt, @@ -9,11 +8,10 @@ import { ValidateIf, MaxLength, Min, - Max, IsNotEmpty, } from 'class-validator'; -import { Type } from 'class-transformer'; import { ApiProperty } from '@nestjs/swagger'; +import { IsOptional, ToNumber } from '@/common/decorators/Validators'; export class CommandItemDto { @IsString() @@ -23,6 +21,7 @@ export class CommandItemDto { name: string; @IsString() + @IsNotEmpty() @IsIn(['service', 'non-inventory', 'inventory']) @ApiProperty({ description: 'Item type', @@ -52,6 +51,7 @@ export class CommandItemDto { purchasable?: boolean; @IsOptional() + @ToNumber() @IsNumber({ maxDecimalPlaces: 3 }) @Min(0) @ValidateIf((o) => o.purchasable === true) @@ -64,6 +64,7 @@ export class CommandItemDto { costPrice?: number; @IsOptional() + @ToNumber() @IsInt() @Min(0) @ValidateIf((o) => o.purchasable === true) @@ -86,6 +87,7 @@ export class CommandItemDto { sellable?: boolean; @IsOptional() + @ToNumber() @IsNumber({ maxDecimalPlaces: 3 }) @Min(0) @ValidateIf((o) => o.sellable === true) @@ -98,6 +100,7 @@ export class CommandItemDto { sellPrice?: number; @IsOptional() + @ToNumber() @IsInt() @Min(0) @ValidateIf((o) => o.sellable === true) @@ -110,6 +113,7 @@ export class CommandItemDto { sellAccountId?: number; @IsOptional() + @ToNumber() @IsInt() @Min(0) @ValidateIf((o) => o.type === 'inventory') @@ -140,6 +144,7 @@ export class CommandItemDto { purchaseDescription?: string; @IsOptional() + @ToNumber() @IsInt() @ApiProperty({ description: 'ID of the tax rate applied to sales', @@ -149,6 +154,7 @@ export class CommandItemDto { sellTaxRateId?: number; @IsOptional() + @ToNumber() @IsInt() @ApiProperty({ description: 'ID of the tax rate applied to purchases', @@ -158,6 +164,7 @@ export class CommandItemDto { purchaseTaxRateId?: number; @IsOptional() + @ToNumber() @IsInt() @Min(0) @ApiProperty({ @@ -189,7 +196,6 @@ export class CommandItemDto { @IsOptional() @IsArray() - @Type(() => Number) @IsInt({ each: true }) @ApiProperty({ description: 'IDs of media files associated with the item', diff --git a/packages/server/src/modules/Roles/Roles.application.ts b/packages/server/src/modules/Roles/Roles.application.ts index c7a0714b7..296854f12 100644 --- a/packages/server/src/modules/Roles/Roles.application.ts +++ b/packages/server/src/modules/Roles/Roles.application.ts @@ -4,6 +4,7 @@ import { DeleteRoleService } from './commands/DeleteRole.service'; import { EditRoleService } from './commands/EditRole.service'; import { GetRoleService } from './queries/GetRole.service'; import { GetRolesService } from './queries/GetRoles.service'; +import { RolePermissionsSchema } from './queries/RolePermissionsSchema'; @Injectable() export class RolesApplication { @@ -13,6 +14,7 @@ export class RolesApplication { private readonly deleteRoleService: DeleteRoleService, private readonly getRoleService: GetRoleService, private readonly getRolesService: GetRolesService, + private readonly getRolePermissionsSchemaService: RolePermissionsSchema, ) {} /** @@ -59,4 +61,12 @@ export class RolesApplication { async getRoles() { return this.getRolesService.getRoles(); } + + /** + * Gets the role permissions schema. + * @returns The role permissions schema. + */ + async getRolePermissionsSchema() { + return this.getRolePermissionsSchemaService.getRolePermissionsSchema(); + } } diff --git a/packages/server/src/modules/Roles/Roles.controller.ts b/packages/server/src/modules/Roles/Roles.controller.ts index 0ce6bf7f5..b1e68aad0 100644 --- a/packages/server/src/modules/Roles/Roles.controller.ts +++ b/packages/server/src/modules/Roles/Roles.controller.ts @@ -72,9 +72,7 @@ export class RolesController { status: HttpStatus.OK, description: 'Role deleted successfully', }) - async deleteRole( - @Param('id', ParseIntPipe) roleId: number, - ) { + async deleteRole(@Param('id', ParseIntPipe) roleId: number) { await this.rolesApp.deleteRole(roleId); return { @@ -83,24 +81,34 @@ export class RolesController { }; } + @Get('permissions/schema') + @ApiOperation({ summary: 'Get role permissions schema' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Role permissions schema', + }) + async getRolePermissionsSchema() { + const schema = await this.rolesApp.getRolePermissionsSchema(); + + return schema; + } + @Get() @ApiOperation({ summary: 'Get all roles' }) @ApiResponse({ status: HttpStatus.OK, description: 'List of all roles' }) async getRoles() { const roles = await this.rolesApp.getRoles(); - return { roles }; + return roles; } @Get(':id') @ApiOperation({ summary: 'Get a specific role by ID' }) @ApiParam({ name: 'id', description: 'Role ID' }) @ApiResponse({ status: HttpStatus.OK, description: 'Role details' }) - async getRole( - @Param('id', ParseIntPipe) roleId: number, - ) { + async getRole(@Param('id', ParseIntPipe) roleId: number) { const role = await this.rolesApp.getRole(roleId); - return { role }; + return role; } } diff --git a/packages/server/src/modules/Roles/Roles.module.ts b/packages/server/src/modules/Roles/Roles.module.ts index 602e9f1b0..4e00ba21e 100644 --- a/packages/server/src/modules/Roles/Roles.module.ts +++ b/packages/server/src/modules/Roles/Roles.module.ts @@ -9,6 +9,7 @@ import { Role } from './models/Role.model'; import { RolePermission } from './models/RolePermission.model'; import { RolesController } from './Roles.controller'; import { RolesApplication } from './Roles.application'; +import { RolePermissionsSchema } from './queries/RolePermissionsSchema'; const models = [ RegisterTenancyModel(Role), @@ -24,6 +25,7 @@ const models = [ GetRoleService, GetRolesService, RolesApplication, + RolePermissionsSchema ], controllers: [RolesController], exports: [...models], diff --git a/packages/server/src/modules/Roles/commands/CreateRole.service.ts b/packages/server/src/modules/Roles/commands/CreateRole.service.ts index 7ab9b5905..7a0273d87 100644 --- a/packages/server/src/modules/Roles/commands/CreateRole.service.ts +++ b/packages/server/src/modules/Roles/commands/CreateRole.service.ts @@ -1,12 +1,12 @@ import { Knex } from 'knex'; +import { Inject, Injectable } from '@nestjs/common'; +import { EventEmitter2 } from '@nestjs/event-emitter'; import { IRoleCreatedPayload } from '../Roles.types'; import { Role } from './../models/Role.model'; -import { EventEmitter2 } from '@nestjs/event-emitter'; import { UnitOfWork } from '../../Tenancy/TenancyDB/UnitOfWork.service'; import { events } from '@/common/events/events'; import { CreateRoleDto } from '../dtos/Role.dto'; import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel'; -import { Inject, Injectable } from '@nestjs/common'; import { validateInvalidPermissions } from '../utils'; @Injectable() diff --git a/packages/server/src/modules/Roles/queries/RolePermissionsSchema.ts b/packages/server/src/modules/Roles/queries/RolePermissionsSchema.ts index 6a2b42441..2343486c5 100644 --- a/packages/server/src/modules/Roles/queries/RolePermissionsSchema.ts +++ b/packages/server/src/modules/Roles/queries/RolePermissionsSchema.ts @@ -1,12 +1,42 @@ import { AbilitySchema } from '../AbilitySchema'; import { Injectable } from '@nestjs/common'; +import { I18nService } from 'nestjs-i18n'; +import { cloneDeep } from 'lodash'; +import { ISubjectAbilitiesSchema } from '../Roles.types'; @Injectable() export class RolePermissionsSchema { + constructor(private readonly i18nService: I18nService) {} + /** - * Retrieve the role permissions schema. + * Retrieve the role permissions schema with translated labels. + * @returns {ISubjectAbilitiesSchema[]} */ - getRolePermissionsSchema() { - return AbilitySchema; + getRolePermissionsSchema(): ISubjectAbilitiesSchema[] { + // Clone the schema to avoid modifying the original + const schema = cloneDeep(AbilitySchema); + + // Apply translations to each subject and its abilities + return schema.map((subject: ISubjectAbilitiesSchema) => { + // Translate subject label + subject.subjectLabel = this.i18nService.t(subject.subjectLabel); + + // Translate abilities labels + if (subject.abilities) { + subject.abilities = subject.abilities.map((ability) => ({ + ...ability, + label: this.i18nService.t(ability.label), + })); + } + // Translate extra abilities labels if they exist + if (subject.extraAbilities) { + subject.extraAbilities = subject.extraAbilities.map((ability) => ({ + ...ability, + label: this.i18nService.t(ability.label), + })); + } + + return subject; + }); } } diff --git a/packages/server/src/modules/SaleEstimates/models/SaleEstimate.ts b/packages/server/src/modules/SaleEstimates/models/SaleEstimate.ts index a7aabd836..7ba822dd1 100644 --- a/packages/server/src/modules/SaleEstimates/models/SaleEstimate.ts +++ b/packages/server/src/modules/SaleEstimates/models/SaleEstimate.ts @@ -6,6 +6,9 @@ import { ExportableModel } from '@/modules/Export/decorators/ExportableModel.dec import { ImportableModel } from '@/modules/Import/decorators/Import.decorator'; import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator'; import { SaleEstimateMeta } from './SaleEstimate.meta'; +import { ItemEntry } from '@/modules/TransactionItemEntry/models/ItemEntry'; +import { Document } from '@/modules/ChromiumlyTenancy/models/Document'; +import { Customer } from '@/modules/Customers/models/Customer'; @ExportableModel() @ImportableModel() @@ -40,6 +43,10 @@ export class SaleEstimate extends TenantBaseModel { branchId?: number; warehouseId?: number; + public entries!: ItemEntry[]; + public attachments!: Document[]; + public customer!: Customer; + /** * Table name */ diff --git a/packages/server/src/modules/SaleEstimates/queries/SaleEstimate.transformer.ts b/packages/server/src/modules/SaleEstimates/queries/SaleEstimate.transformer.ts index 85f177aa0..8558625f3 100644 --- a/packages/server/src/modules/SaleEstimates/queries/SaleEstimate.transformer.ts +++ b/packages/server/src/modules/SaleEstimates/queries/SaleEstimate.transformer.ts @@ -1,10 +1,7 @@ -// import { Transformer } from '@/lib/Transformer/Transformer'; -// import { ItemEntryTransformer } from '../Invoices/ItemEntryTransformer'; -// import { AttachmentTransformer } from '@/services/Attachments/AttachmentTransformer'; - import { Transformer } from '@/modules/Transformer/Transformer'; import { SaleEstimate } from '../models/SaleEstimate'; import { ItemEntryTransformer } from '@/modules/TransactionItemEntry/ItemEntry.transformer'; +import { AttachmentTransformer } from '@/modules/Attachments/Attachment.transformer'; export class SaleEstimateTransfromer extends Transformer { /** @@ -106,9 +103,9 @@ export class SaleEstimateTransfromer extends Transformer { * @returns {} */ protected entries = (estimate: SaleEstimate) => { - // return this.item(estimate.entries, new ItemEntryTransformer(), { - // currencyCode: estimate.currencyCode, - // }); + return this.item(estimate.entries, new ItemEntryTransformer(), { + currencyCode: estimate.currencyCode, + }); }; /** @@ -117,6 +114,6 @@ export class SaleEstimateTransfromer extends Transformer { * @returns */ protected attachments = (estimate: SaleEstimate) => { - // return this.item(estimate.attachments, new AttachmentTransformer()); + return this.item(estimate.attachments, new AttachmentTransformer()); }; } diff --git a/packages/server/src/modules/Warehouses/Warehouses.controller.ts b/packages/server/src/modules/Warehouses/Warehouses.controller.ts index 65d88f02a..3c5a32d10 100644 --- a/packages/server/src/modules/Warehouses/Warehouses.controller.ts +++ b/packages/server/src/modules/Warehouses/Warehouses.controller.ts @@ -57,7 +57,7 @@ export class WarehousesController { return this.warehousesApplication.activateWarehouses(); } - @Post(':id/mark-primary') + @Put(':id/mark-primary') @ApiOperation({ summary: 'Mark a warehouse as primary' }) markWarehousePrimary(@Param('id') warehouseId: string) { return this.warehousesApplication.markWarehousePrimary(Number(warehouseId)); diff --git a/packages/server/src/modules/Warehouses/WarehousesSettings.ts b/packages/server/src/modules/Warehouses/WarehousesSettings.ts index 2ec7c0335..4319539ac 100644 --- a/packages/server/src/modules/Warehouses/WarehousesSettings.ts +++ b/packages/server/src/modules/Warehouses/WarehousesSettings.ts @@ -17,6 +17,8 @@ export class WarehousesSettings { const settings = await this.settingsStore(); settings.set({ group: 'features', key: Features.WAREHOUSES, value: 1 }); + + await settings.save(); }; /** diff --git a/packages/server/src/modules/Warehouses/commands/CreateInitialWarehouse.service.ts b/packages/server/src/modules/Warehouses/commands/CreateInitialWarehouse.service.ts index 1761c34c1..07d27b8f1 100644 --- a/packages/server/src/modules/Warehouses/commands/CreateInitialWarehouse.service.ts +++ b/packages/server/src/modules/Warehouses/commands/CreateInitialWarehouse.service.ts @@ -1,16 +1,16 @@ import { CreateWarehouse } from './CreateWarehouse.service'; import { Injectable } from '@nestjs/common'; -import { I18nContext } from 'nestjs-i18n'; +import { I18nService } from 'nestjs-i18n'; @Injectable() export class CreateInitialWarehouse { /** * @param {CreateWarehouse} createWarehouse - Create warehouse service. - * @param {I18nContext} i18n - I18n context. + * @param {I18nService} i18n - I18n service. */ constructor( private readonly createWarehouse: CreateWarehouse, - private readonly i18n: I18nContext, + private readonly i18n: I18nService, ) {} /** diff --git a/packages/server/src/modules/Warehouses/dtos/Warehouse.dto.ts b/packages/server/src/modules/Warehouses/dtos/Warehouse.dto.ts index 885a5dde9..3b69744cd 100644 --- a/packages/server/src/modules/Warehouses/dtos/Warehouse.dto.ts +++ b/packages/server/src/modules/Warehouses/dtos/Warehouse.dto.ts @@ -1,5 +1,6 @@ +import { IsOptional } from "@/common/decorators/Validators"; import { ApiProperty } from "@nestjs/swagger"; -import { IsBoolean, IsEmail, IsOptional, IsUrl } from "class-validator"; +import { IsBoolean, IsEmail, IsUrl } from "class-validator"; import { IsNotEmpty } from "class-validator"; import { IsString } from "class-validator"; diff --git a/packages/webapp/src/hooks/query/branches.tsx b/packages/webapp/src/hooks/query/branches.tsx index 9279caeba..1a41dbea1 100644 --- a/packages/webapp/src/hooks/query/branches.tsx +++ b/packages/webapp/src/hooks/query/branches.tsx @@ -38,7 +38,7 @@ export function useEditBranch(props) { const apiRequest = useApiRequest(); return useMutation( - ([id, values]) => apiRequest.post(`branches/${id}`, values), + ([id, values]) => apiRequest.put(`branches/${id}`, values), { onSuccess: (res, [id, values]) => { // Invalidate specific branch. @@ -79,7 +79,7 @@ export function useBranches(query, props) { [t.BRANCHES, query], { method: 'get', url: 'branches', params: query }, { - select: (res) => res.data.branches, + select: (res) => res.data, defaultData: [], ...props, }, @@ -95,7 +95,7 @@ export function useBranch(id, props, requestProps) { [t.BRANCH, id], { method: 'get', url: `branches/${id}`, ...requestProps }, { - select: (res) => res.data.branch, + select: (res) => res.data, defaultData: {}, ...props, }, diff --git a/packages/webapp/src/hooks/query/currencies.tsx b/packages/webapp/src/hooks/query/currencies.tsx index 09e755ca9..2c53f1c4b 100644 --- a/packages/webapp/src/hooks/query/currencies.tsx +++ b/packages/webapp/src/hooks/query/currencies.tsx @@ -21,15 +21,15 @@ export function useCreateCurrency(props) { } /** - * Edits the given currency code. + * Edits the given currency by ID. */ export function useEditCurrency(props) { const queryClient = useQueryClient(); const apiRequest = useApiRequest(); return useMutation( - ([currencyCode, values]) => - apiRequest.post(`currencies/${currencyCode}`, values), + ([currencyId, values]) => + apiRequest.put(`currencies/${currencyId}`, values), { onSuccess: () => { // Invalidate currencies. diff --git a/packages/webapp/src/hooks/query/expenses.tsx b/packages/webapp/src/hooks/query/expenses.tsx index 5292dbcd1..2798ad71b 100644 --- a/packages/webapp/src/hooks/query/expenses.tsx +++ b/packages/webapp/src/hooks/query/expenses.tsx @@ -76,7 +76,7 @@ export function useExpense(id, props) { url: `expenses/${id}`, }, { - select: (res) => res.data.expense, + select: (res) => res.data, defaultData: {}, ...props, }, diff --git a/packages/webapp/src/hooks/query/itemsCategories.tsx b/packages/webapp/src/hooks/query/itemsCategories.tsx index bdb28d480..209d0e6ee 100644 --- a/packages/webapp/src/hooks/query/itemsCategories.tsx +++ b/packages/webapp/src/hooks/query/itemsCategories.tsx @@ -101,7 +101,7 @@ export function useItemCategory(id, props) { [t.ITEM_CATEGORY, id], { method: 'get', url: `item-categories/${id}` }, { - select: (res) => res.data.category, + select: (res) => res.data, defaultData: {}, ...props, }, diff --git a/packages/webapp/src/hooks/query/manualJournals.tsx b/packages/webapp/src/hooks/query/manualJournals.tsx index 7af2c84a5..92f6f3e60 100644 --- a/packages/webapp/src/hooks/query/manualJournals.tsx +++ b/packages/webapp/src/hooks/query/manualJournals.tsx @@ -139,7 +139,7 @@ export function useJournal(id, props) { [t.MANUAL_JOURNAL, id], { method: 'get', url: `manual-journals/${id}` }, { - select: (res) => res.data.manual_journal, + select: (res) => res.data, defaultData: {}, ...props, }, diff --git a/packages/webapp/src/hooks/query/paymentMades.tsx b/packages/webapp/src/hooks/query/paymentMades.tsx index 07c11e235..1e568df76 100644 --- a/packages/webapp/src/hooks/query/paymentMades.tsx +++ b/packages/webapp/src/hooks/query/paymentMades.tsx @@ -185,7 +185,7 @@ export function usePaymentMade(id, props) { [t.PAYMENT_MADE, id], { method: 'get', url: `bill-payments/${id}` }, { - select: (res) => res.data.bill_payment, + select: (res) => res.data, defaultData: {}, ...props, }, diff --git a/packages/webapp/src/hooks/query/receipts.tsx b/packages/webapp/src/hooks/query/receipts.tsx index 03d65c25c..53d13ead9 100644 --- a/packages/webapp/src/hooks/query/receipts.tsx +++ b/packages/webapp/src/hooks/query/receipts.tsx @@ -159,7 +159,7 @@ export function useReceipt(id, props) { ['SALE_RECEIPT', id], { method: 'get', url: `sale-receipts/${id}` }, { - select: (res) => res.data.sale_receipt, + select: (res) => res.data, defaultData: {}, ...props, }, @@ -211,7 +211,7 @@ export function useReceiptSMSDetail(receiptId, props, requestProps) { ...requestProps, }, { - select: (res) => res.data.data, + select: (res) => res.data, defaultData: {}, ...props, }, @@ -304,7 +304,7 @@ export function useSaleReceiptMailState( () => apiRequest .get(`sale-receipts/${receiptId}/mail`) - .then((res) => transformToCamelCase(res.data.data)), + .then((res) => transformToCamelCase(res.data)), ); } @@ -322,7 +322,7 @@ export function useGetReceiptState( () => apiRequest .get(`/sale-receipts/state`) - .then((res) => transformToCamelCase(res.data?.data)), + .then((res) => transformToCamelCase(res.data)), { ...options }, ); } diff --git a/packages/webapp/src/hooks/query/roles.tsx b/packages/webapp/src/hooks/query/roles.tsx index 0de8ebffc..164d7adcd 100644 --- a/packages/webapp/src/hooks/query/roles.tsx +++ b/packages/webapp/src/hooks/query/roles.tsx @@ -69,7 +69,7 @@ export function usePermissionsSchema(query, props) { [t.ROLES_PERMISSIONS_SCHEMA, query], { method: 'get', url: 'roles/permissions/schema', params: query }, { - select: (res) => res.data.data, + select: (res) => res.data, defaultData: { roles: [], }, @@ -87,7 +87,7 @@ export function useRolePermission(role_id, props, requestProps) { [t.ROLE, role_id], { method: 'get', url: `roles/${role_id}`, ...requestProps }, { - select: (res) => res.data.role, + select: (res) => res.data, defaultData: {}, ...props, }, @@ -102,7 +102,7 @@ export function useRoles(props, query) { [t.ROLES, query], { method: 'get', url: `roles`, params: query }, { - select: (res) => res.data.roles, + select: (res) => res.data, defaultData: [], ...props, }, diff --git a/packages/webapp/src/hooks/query/settings.tsx b/packages/webapp/src/hooks/query/settings.tsx index 206cc217a..9e2250602 100644 --- a/packages/webapp/src/hooks/query/settings.tsx +++ b/packages/webapp/src/hooks/query/settings.tsx @@ -13,7 +13,7 @@ export function useSaveSettings(props) { const queryClient = useQueryClient(); const apiRequest = useApiRequest(); - return useMutation((settings) => apiRequest.post('settings', settings), { + return useMutation((settings) => apiRequest.put('settings', settings), { onSuccess: () => { queryClient.invalidateQueries(t.SETTING); }, diff --git a/packages/webapp/src/hooks/query/vendorCredit.tsx b/packages/webapp/src/hooks/query/vendorCredit.tsx index 1e7d7160d..fead76a26 100644 --- a/packages/webapp/src/hooks/query/vendorCredit.tsx +++ b/packages/webapp/src/hooks/query/vendorCredit.tsx @@ -156,7 +156,7 @@ export function useVendorCredit(id, props, requestProps) { [t.VENDOR_CREDIT, id], { method: 'get', url: `vendor-credits/${id}`, ...requestProps }, { - select: (res) => res.data.data, + select: (res) => res.data, defaultData: {}, ...props, }, @@ -232,7 +232,7 @@ export function useRefundVendorCredit(id, props, requestProps) { ...requestProps, }, { - select: (res) => res.data.data, + select: (res) => res.data, defaultData: {}, ...props, }, @@ -298,7 +298,7 @@ export function useReconcileVendorCredit(id, props, requestProps) { ...requestProps, }, { - select: (res) => res.data.data, + select: (res) => res.data, defaultData: [], ...props, }, @@ -317,7 +317,7 @@ export function useReconcileVendorCredits(id, props, requestProps) { ...requestProps, }, { - select: (res) => res.data.data, + select: (res) => res.data, defaultData: {}, ...props, }, @@ -359,7 +359,7 @@ export function useRefundVendorCreditTransaction(id, props, requestProps) { ...requestProps, }, { - select: (res) => res.data.refund_credit, + select: (res) => res.data, defaultData: {}, ...props, }, diff --git a/packages/webapp/src/hooks/query/warehouses.tsx b/packages/webapp/src/hooks/query/warehouses.tsx index 4cfebedd3..bb3729ce1 100644 --- a/packages/webapp/src/hooks/query/warehouses.tsx +++ b/packages/webapp/src/hooks/query/warehouses.tsx @@ -41,7 +41,7 @@ export function useEditWarehouse(props) { const apiRequest = useApiRequest(); return useMutation( - ([id, values]) => apiRequest.post(`warehouses/${id}`, values), + ([id, values]) => apiRequest.put(`warehouses/${id}`, values), { onSuccess: (res, [id, values]) => { // Invalidate specific sale invoice. @@ -82,7 +82,7 @@ export function useWarehouses(query, props) { [t.WAREHOUSES, query], { method: 'get', url: 'warehouses', params: query }, { - select: (res) => res.data.warehouses, + select: (res) => res.data, defaultData: [], ...props, }, @@ -98,7 +98,7 @@ export function useWarehouse(id, props, requestProps) { [t.WAREHOUSE, id], { method: 'get', url: `warehouses/${id}`, ...requestProps }, { - select: (res) => res.data.warehouse, + select: (res) => res.data, defaultData: {}, ...props, }, @@ -128,7 +128,7 @@ export function useMarkWarehouseAsPrimary(props) { const queryClient = useQueryClient(); const apiRequest = useApiRequest(); - return useMutation((id) => apiRequest.post(`warehouses/${id}/mark-primary`), { + return useMutation((id) => apiRequest.put(`warehouses/${id}/mark-primary`), { onSuccess: (res, id) => { // Invalidate specific inventory adjustment. queryClient.invalidateQueries([t.WAREHOUSE, id]);