diff --git a/apps/api/src/app/resolvers.ts b/apps/api/src/app/resolvers.ts index 052b15a..e46268e 100644 --- a/apps/api/src/app/resolvers.ts +++ b/apps/api/src/app/resolvers.ts @@ -17,6 +17,7 @@ import { MenuResolver } from './resolvers/menu.resolver'; import { OrganizationResolver } from './resolvers/organization.resolver'; import { ProductResolver } from './resolvers/product.resolver'; import { SalesInvoiceResolver } from './resolvers/sales.invoice.resolver'; +import { TaxResolver } from './resolvers/tax.resolver'; export const resolvers = [ AppResolver, @@ -39,4 +40,5 @@ export const resolvers = [ FactoringContractResolver, AttachmentResolver, MailResolver, + TaxResolver, ]; diff --git a/apps/api/src/app/resolvers/tax.resolver.ts b/apps/api/src/app/resolvers/tax.resolver.ts new file mode 100644 index 0000000..a85f64a --- /dev/null +++ b/apps/api/src/app/resolvers/tax.resolver.ts @@ -0,0 +1,36 @@ +import { Inject, UseGuards } from '@nestjs/common'; +import { Args, Int, Mutation, Query, Resolver } from '@nestjs/graphql'; +import { InjectEntityManager } from '@nestjs/typeorm'; +import { EntityManager } from 'typeorm'; +import { CurrentUser, GqlAuthGuard } from '../../auth'; +import { TaxModel, TaxService, TaxServiceKey } from '../../model'; +import { Tax } from '../../model/generated/entities/Tax'; +import { TaxSaveArgs } from '../saveArgs/tax.save.args'; + +@Resolver(() => Tax) +@UseGuards(GqlAuthGuard) +export class TaxResolver { + constructor( + @Inject(TaxServiceKey) protected readonly taxService: TaxService, + @InjectEntityManager() + private readonly entityManager: EntityManager, + ) {} + + @Query(() => [Tax]) + async taxes() { + return await this.taxService.loadEntities(this.entityManager); + } + + @Query(() => Tax) + async tax(@Args('id', { type: () => Int }) id: number) { + return await this.taxService.loadEntityById(this.entityManager, id); + } + + @Mutation(() => Tax) + async saveTax( + @Args('args') objData: TaxSaveArgs, + @CurrentUser() user, + ): Promise { + return await this.taxService.save(this.entityManager, objData, user); + } +} diff --git a/apps/api/src/app/saveArgs/tax.save.args.ts b/apps/api/src/app/saveArgs/tax.save.args.ts new file mode 100644 index 0000000..d0fe8cc --- /dev/null +++ b/apps/api/src/app/saveArgs/tax.save.args.ts @@ -0,0 +1,13 @@ +import { Field, InputType } from '@nestjs/graphql'; +import { TaxSaveArgsModel } from '../../model'; +import { BaseSaveArgs } from './base.save.args'; + +@InputType() +export class TaxSaveArgs extends BaseSaveArgs implements TaxSaveArgsModel { + @Field() + displayName: string; + @Field() + ratePercent: number; + @Field() + isStandard: boolean; +} diff --git a/apps/api/src/model/generated/entities/Tax.ts b/apps/api/src/model/generated/entities/Tax.ts index 22d8664..d7f6536 100644 --- a/apps/api/src/model/generated/entities/Tax.ts +++ b/apps/api/src/model/generated/entities/Tax.ts @@ -1,4 +1,4 @@ -import { Field } from '@nestjs/graphql'; +import { Field, ObjectType } from '@nestjs/graphql'; import { Column, Entity, @@ -12,8 +12,10 @@ import { SalesInvoiceLine } from './SalesInvoiceLine'; import { User } from './User'; @Entity('tax', { schema: 'public' }) +@ObjectType() export class Tax { @PrimaryGeneratedColumn({ type: 'integer', name: 'id' }) + @Field() id: number; @Column('timestamp without time zone', { @@ -37,12 +39,15 @@ export class Tax { isCurrent: boolean; @Column('character varying', { name: 'displayName' }) + @Field() displayName: string; @Column('integer', { name: 'ratePercent' }) + @Field() ratePercent: number; @Column('boolean', { name: 'isStandard' }) + @Field() isStandard: boolean; @OneToMany( diff --git a/apps/api/src/model/lib/document.numbering.service.ts b/apps/api/src/model/lib/document.numbering.service.ts index bcb224a..c9acce3 100644 --- a/apps/api/src/model/lib/document.numbering.service.ts +++ b/apps/api/src/model/lib/document.numbering.service.ts @@ -17,7 +17,7 @@ export class DocumentNumberingService { organization: OrganizationModel, ): Promise { const model = await manager.getRepository(DocumentNumberSequence).findOne({ - where: { forType: modelCtor.name, organization }, + where: { forType: modelCtor.name, organization: { id: organization.id } }, order: { id: 'DESC' }, }); const result = model.current; diff --git a/apps/api/src/model/lib/sales.invoice.service.ts b/apps/api/src/model/lib/sales.invoice.service.ts index dd07d35..5ddab47 100644 --- a/apps/api/src/model/lib/sales.invoice.service.ts +++ b/apps/api/src/model/lib/sales.invoice.service.ts @@ -757,8 +757,15 @@ export class SalesInvoiceService extends BaseEntityService< currentUser: UserModel, ): Promise => { const source = await this.loadEntityById(transactionalEntityManager, id); - source.isDraft = true; - return this.save(transactionalEntityManager, source, currentUser); + const copy = { + ...source, + id: null, + isDraft: true, + documentNo: null, + printed: false, + isCalculated: false, + }; + return this.save(transactionalEntityManager, copy, currentUser); }; publish = async ( diff --git a/build_deploy_dokku.sh b/build_deploy_dokku.sh new file mode 100755 index 0000000..17a5b51 --- /dev/null +++ b/build_deploy_dokku.sh @@ -0,0 +1 @@ +git push dokku HEAD:main --force \ No newline at end of file