update
This commit is contained in:
@@ -9,6 +9,9 @@ using MyOffice.Data.Models.Accounts;
|
|||||||
public class Item
|
public class Item
|
||||||
{
|
{
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// UnCategorized category is CategoryId = UserId
|
||||||
|
/// </summary>
|
||||||
public Guid CategoryId { get; set; }
|
public Guid CategoryId { get; set; }
|
||||||
public ItemCategory Category { get; set; } = null!;
|
public ItemCategory Category { get; set; } = null!;
|
||||||
public Guid ItemGlobalId { get; set; }
|
public Guid ItemGlobalId { get; set; }
|
||||||
|
|||||||
@@ -6,4 +6,7 @@ public interface IMotionRepository
|
|||||||
{
|
{
|
||||||
bool Add(Motion motion);
|
bool Add(Motion motion);
|
||||||
List<Motion> GetByAccount(Guid accountId, DateTime dateFrom, DateTime dateTo);
|
List<Motion> GetByAccount(Guid accountId, DateTime dateFrom, DateTime dateTo);
|
||||||
|
Motion? Get(Guid userId, Guid id);
|
||||||
|
bool Update(Motion motion);
|
||||||
|
bool Remove(Motion motion);
|
||||||
}
|
}
|
||||||
@@ -21,4 +21,23 @@ public class MotionRepository : AppRepository<Motion>, IMotionRepository
|
|||||||
.ThenByDescending(x => x.CreatedOn)
|
.ThenByDescending(x => x.CreatedOn)
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Motion? Get(Guid userId, Guid id)
|
||||||
|
{
|
||||||
|
return _context
|
||||||
|
.Motions
|
||||||
|
.Include(x => x.Item)
|
||||||
|
.ThenInclude(x => x.ItemGlobal)
|
||||||
|
.FirstOrDefault(x => x.Account!.AccessRights!.Any(a => a.UserId == userId) && x.Id == id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Update(Motion motion)
|
||||||
|
{
|
||||||
|
return UpdateBase(motion) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(Motion motion)
|
||||||
|
{
|
||||||
|
return RemoveBase(motion) > 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
// angular
|
// angular
|
||||||
import { NgModule, Optional, SkipSelf, CUSTOM_ELEMENTS_SCHEMA, APP_INITIALIZER } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
|
import { Optional } from '@angular/core';
|
||||||
|
import { SkipSelf } from '@angular/core';
|
||||||
|
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
|
||||||
|
import { APP_INITIALIZER } from '@angular/core';
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
|
|
||||||
// libs
|
// libs
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
export interface AccountMotionModel {
|
export interface MotionModel {
|
||||||
id?: string;
|
id?: string;
|
||||||
date?: Date;
|
date?: Date;
|
||||||
motion?: string;
|
motion?: string;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<mat-expansion-panel [expanded]="expanded">
|
<mat-expansion-panel [expanded]="active" (afterExpand)="afterExpand()">
|
||||||
<mat-expansion-panel-header>
|
<mat-expansion-panel-header>
|
||||||
<mat-panel-description>
|
<mat-panel-description>
|
||||||
<h4>{{account.account.name}}</h4>
|
<h4>{{account.account.name}}</h4>
|
||||||
@@ -36,9 +36,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<hr/>
|
<hr />
|
||||||
<account-motion [motion]="newMotion" [account]="account.account" (onAdd)="handlerOnAdd($event)">
|
<account-motion [motion]="newMotion" [account]="account.account" (onAdd)="handlerOnAdd($event)">
|
||||||
</account-motion>
|
</account-motion>
|
||||||
<account-motion *ngFor="let motion of motions" [motion]="motion" [account]="account.account">
|
<account-motion *ngFor="let motion of motions"
|
||||||
|
[motion]="motion"
|
||||||
|
[account]="account.account"
|
||||||
|
(onDelete)="handlerOnDelete($event)">
|
||||||
</account-motion>
|
</account-motion>
|
||||||
</mat-expansion-panel>
|
</mat-expansion-panel>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import * as moment from 'moment';
|
|||||||
// app
|
// app
|
||||||
import { ApiRoutes } from '../../api-routes';
|
import { ApiRoutes } from '../../api-routes';
|
||||||
import { AccountDetailedModel } from '../../model/account.detailed.model';
|
import { AccountDetailedModel } from '../../model/account.detailed.model';
|
||||||
import { AccountMotionModel } from '../../model/account.motion';
|
import { MotionModel } from '../../model/motion.model';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
templateUrl: './account.component.html',
|
templateUrl: './account.component.html',
|
||||||
@@ -23,13 +23,13 @@ import { AccountMotionModel } from '../../model/account.motion';
|
|||||||
selector: 'account'
|
selector: 'account'
|
||||||
})
|
})
|
||||||
export class AccountComponent {
|
export class AccountComponent {
|
||||||
public motions?: AccountMotionModel[];
|
public motions?: MotionModel[];
|
||||||
public newMotion: AccountMotionModel;
|
public newMotion: MotionModel;
|
||||||
public form!: UntypedFormGroup;
|
public form!: UntypedFormGroup;
|
||||||
@Input('account') account!: AccountDetailedModel;
|
@Input('account') account!: AccountDetailedModel;
|
||||||
@Input('expanded') expanded!: boolean;
|
@Input('active') active: boolean = false;
|
||||||
|
|
||||||
@Output() onUpdate: EventEmitter<AccountMotionModel> = new EventEmitter<AccountMotionModel>();
|
@Output() onUpdate: EventEmitter<MotionModel> = new EventEmitter<MotionModel>();
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private fb: UntypedFormBuilder,
|
private fb: UntypedFormBuilder,
|
||||||
@@ -60,27 +60,18 @@ export class AccountComponent {
|
|||||||
onSubmitClick() {
|
onSubmitClick() {
|
||||||
}
|
}
|
||||||
|
|
||||||
handlerOnAdd(accountMotion: AccountMotionModel) {
|
handlerOnAdd(motion: MotionModel) {
|
||||||
this.loadMotions();
|
this.loadMotions();
|
||||||
this.httpClient
|
this.httpClient
|
||||||
.get<AccountDetailedModel>(ApiRoutes.Account.replace(':id', this.account.account!.id!))
|
.get<AccountDetailedModel>(ApiRoutes.Account.replace(':id', this.account.account!.id!))
|
||||||
.subscribe(data => {
|
.subscribe(data => {
|
||||||
this.account = data;
|
this.account = data;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/*var md = moment(accountMotion.date);
|
handlerOnDelete(motion: MotionModel) {
|
||||||
var mdf = moment(this.form.value.dateFrom);
|
const index = this.motions!.findIndex(x => x.id === motion.id);
|
||||||
var mdt = moment(this.form.value.dateTo);
|
this.motions!.splice(index, 1);
|
||||||
if (md.isBetween(mdf, mdt, 'days', '[]')) {
|
|
||||||
this.motions?.push(accountMotion);
|
|
||||||
//this.motions?.sort((a, b) => (b.date!.getMilliseconds() - a.date!.getMilliseconds()));
|
|
||||||
this.motions?.sort((a, b) => {
|
|
||||||
var aa = moment(a.date).toDate();
|
|
||||||
var bb = moment(b.date).toDate();
|
|
||||||
|
|
||||||
return (bb.getMilliseconds() - aa.getMilliseconds());
|
|
||||||
});
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private loadMotions() {
|
private loadMotions() {
|
||||||
@@ -90,10 +81,19 @@ export class AccountComponent {
|
|||||||
|
|
||||||
this.activatedRoute.params.subscribe(params => {
|
this.activatedRoute.params.subscribe(params => {
|
||||||
this.httpClient
|
this.httpClient
|
||||||
.get<AccountMotionModel[]>(url)
|
.get<MotionModel[]>(url)
|
||||||
.subscribe(data => {
|
.subscribe(data => {
|
||||||
this.motions = data;
|
this.motions = data;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
afterExpand() {
|
||||||
|
var refresh = window.location.protocol + "//";
|
||||||
|
refresh += window.location.host;
|
||||||
|
refresh += window.location.pathname;
|
||||||
|
refresh += window.location.hash;
|
||||||
|
refresh += '/account/' + this.account.account.id;
|
||||||
|
window.history.pushState({ path: refresh }, '', refresh);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
|
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
|
||||||
<mat-accordion class="main-headers-align" multi>
|
<mat-accordion class="main-headers-align" multi>
|
||||||
<div *ngFor="let account of accounts; let i = index" >
|
<div *ngFor="let account of accounts; let i = index" >
|
||||||
<account [account]="account" />
|
<account [account]="account" [active]="account.account.id === activeAccount" />
|
||||||
</div>
|
</div>
|
||||||
</mat-accordion>
|
</mat-accordion>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,18 +4,11 @@ import { HttpClient } from '@angular/common/http';
|
|||||||
import { ActivatedRoute } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
|
|
||||||
// libs
|
// libs
|
||||||
import Swal from 'sweetalert2';
|
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
|
||||||
|
|
||||||
// app
|
// app
|
||||||
import { AccountCategoryService } from '../../services/account.category.service';
|
import { AccountCategoryService } from '../../services/account.category.service';
|
||||||
import { ApiRoutes } from '../../api-routes';
|
import { ApiRoutes } from '../../api-routes';
|
||||||
import { AccountCategoryModel } from '../../model/account.category.model';
|
|
||||||
import { SettingsAccountAddComponent } from '../settings/account/add.account.component';
|
|
||||||
import { SettingsAccountEditComponent } from '../settings/account/edit.account.component';
|
|
||||||
import { AccountModel } from '../../model/account.model';
|
|
||||||
import { AccountDetailedModel } from '../../model/account.detailed.model';
|
import { AccountDetailedModel } from '../../model/account.detailed.model';
|
||||||
import { AccountMotionModel } from '../../model/account.motion';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
templateUrl: './account.list.component.html',
|
templateUrl: './account.list.component.html',
|
||||||
@@ -24,12 +17,14 @@ import { AccountMotionModel } from '../../model/account.motion';
|
|||||||
export class AccountListComponent {
|
export class AccountListComponent {
|
||||||
public accounts?: AccountDetailedModel[];
|
public accounts?: AccountDetailedModel[];
|
||||||
public category = '';
|
public category = '';
|
||||||
|
public activeAccount = '';
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private httpClient: HttpClient,
|
private httpClient: HttpClient,
|
||||||
private activatedRoute: ActivatedRoute,
|
private activatedRoute: ActivatedRoute,
|
||||||
private accountCategoryService: AccountCategoryService,
|
private accountCategoryService: AccountCategoryService,
|
||||||
) {
|
) {
|
||||||
|
this.activatedRoute.params.subscribe(x => this.activeAccount = x['accountId']);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<form [formGroup]="form" (ngSubmit)="onSubmitClick()" novalidate autocomplete="off">
|
<form [formGroup]="form" novalidate autocomplete="off">
|
||||||
<div class="" style="display: flex;">
|
<div class="" style="display: flex;">
|
||||||
<div class="" style="width: 310px; min-width: 310px;">
|
<div class="" style="width: 310px; min-width: 310px;">
|
||||||
<div style="display: flex; align-items: center;">
|
<div style="display: flex; align-items: center;">
|
||||||
@@ -42,19 +42,24 @@
|
|||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="" style="display: inline-block; width: 150px; min-width: 150px;">
|
<div class="" style="display: inline-block; width: 150px; min-width: 150px;">
|
||||||
<button type="button" mat-stroked-button color="primary" *ngIf="!motion.id" (click)="onSubmitClick()">
|
<!--
|
||||||
|
<button type="button" mat-stroked-button color="primary" *ngIf="!motion.id" (click)="add()">
|
||||||
<i class="material-icons font-40">add</i>
|
<i class="material-icons font-40">add</i>
|
||||||
</button>
|
</button>
|
||||||
<button mat-stroked-button color="primary" *ngIf="!motion.id" (click)="onSubmitClick()">
|
-->
|
||||||
<i class="material-icons font-40">import_export</i>
|
<button type="button" class="m-2" mat-mini-fab color="primary" *ngIf="!motion.id" (click)="add()">
|
||||||
|
<i class="material-icons ">add</i>
|
||||||
</button>
|
</button>
|
||||||
<button mat-stroked-button color="primary" *ngIf="motion.id" (click)="onSubmitClick()">
|
<button type="button" class="m-2" mat-mini-fab color="primary" *ngIf="!motion.id" (click)="import()">
|
||||||
<i class="material-icons font-40">save</i>
|
<i class="material-icons ">import_export</i>
|
||||||
</button>
|
</button>
|
||||||
<button mat-stroked-button color="primary" *ngIf="motion.id" (click)="onSubmitClick()">
|
<button type="button" class="m-2" mat-mini-fab color="primary" *ngIf="motion.id" (click)="update()">
|
||||||
<i class="material-icons font-40">delete</i>
|
<i class="material-icons ">save</i>
|
||||||
|
</button>
|
||||||
|
<button type="button" class="m-2" mat-mini-fab color="primary" *ngIf="motion.id" (click)="delete()">
|
||||||
|
<i class="material-icons ">delete</i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr/>
|
<hr />
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -12,11 +12,12 @@ import { ElementRef } from '@angular/core';
|
|||||||
|
|
||||||
// libs
|
// libs
|
||||||
import * as moment from 'moment';
|
import * as moment from 'moment';
|
||||||
|
import Swal from 'sweetalert2';
|
||||||
|
|
||||||
// app
|
// app
|
||||||
import { ApiRoutes } from '../../api-routes';
|
import { ApiRoutes } from '../../api-routes';
|
||||||
import { AccountModel } from '../../model/account.model';
|
import { AccountModel } from '../../model/account.model';
|
||||||
import { AccountMotionModel } from '../../model/account.motion';
|
import { MotionModel } from '../../model/motion.model';
|
||||||
import { atLeastOneNumber } from '../../core/validators/atleastonenumber.validator';
|
import { atLeastOneNumber } from '../../core/validators/atleastonenumber.validator';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@@ -28,10 +29,11 @@ export class MotionComponent {
|
|||||||
public form!: FormGroup;
|
public form!: FormGroup;
|
||||||
public errorMessage?: string;
|
public errorMessage?: string;
|
||||||
|
|
||||||
@Input('motion') motion!: AccountMotionModel;
|
@Input('motion') motion!: MotionModel;
|
||||||
@Input('account') account!: AccountModel;
|
@Input('account') account!: AccountModel;
|
||||||
|
|
||||||
@Output() onAdd: EventEmitter<AccountMotionModel> = new EventEmitter<AccountMotionModel>();
|
@Output() onAdd: EventEmitter<MotionModel> = new EventEmitter<MotionModel>();
|
||||||
|
@Output() onDelete: EventEmitter<MotionModel> = new EventEmitter<MotionModel>();
|
||||||
|
|
||||||
@ViewChild('motionInput') motionInput?: ElementRef;
|
@ViewChild('motionInput') motionInput?: ElementRef;
|
||||||
|
|
||||||
@@ -68,28 +70,75 @@ export class MotionComponent {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onSubmitClick() {
|
add() {
|
||||||
this.form.markAllAsTouched();
|
this.form.markAllAsTouched();
|
||||||
|
|
||||||
if (this.form.valid) {
|
this.httpClient
|
||||||
this.httpClient
|
.post<MotionModel>(ApiRoutes.Motions.replace(':id', this.account.id!), this.form.value)
|
||||||
.post<AccountMotionModel>(ApiRoutes.Motions.replace(':id', this.account.id!), this.form.value)
|
.subscribe(response => {
|
||||||
.subscribe(response => {
|
this.onAdd?.emit(response);
|
||||||
if (!this.form.value.id) {
|
|
||||||
this.onAdd?.emit(response);
|
|
||||||
this.form.patchValue({
|
|
||||||
motion: '',
|
|
||||||
plus: 0,
|
|
||||||
minus: 0,
|
|
||||||
});
|
|
||||||
this.form.markAsUntouched();
|
|
||||||
|
|
||||||
this.motionInput?.nativeElement.focus();
|
this.form.patchValue({
|
||||||
}
|
motion: '',
|
||||||
}, error => {
|
plus: 0,
|
||||||
this.errorMessage = error.detail;
|
minus: 0,
|
||||||
});
|
});
|
||||||
}
|
this.form.markAsUntouched();
|
||||||
|
|
||||||
|
this.motionInput?.nativeElement.focus();
|
||||||
|
}, error => {
|
||||||
|
this.errorMessage = error.detail;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
update() {
|
||||||
|
var url = ApiRoutes.Motion
|
||||||
|
.replace(':id', this.account.id!)
|
||||||
|
.replace(':motionId', this.motion.id!);
|
||||||
|
|
||||||
|
this.httpClient
|
||||||
|
.put<MotionModel>(url, this.form.value)
|
||||||
|
.subscribe(response => {
|
||||||
|
this.form.markAsUntouched();
|
||||||
|
}, error => {
|
||||||
|
this.errorMessage = error.detail;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
delete() {
|
||||||
|
Swal.fire({
|
||||||
|
title: 'Delete motion ' + this.motion.motion,
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonText: 'Delete',
|
||||||
|
showLoaderOnConfirm: true,
|
||||||
|
preConfirm: (name) => {
|
||||||
|
return new Promise<MotionModel>((resolve, reject) => {
|
||||||
|
var url = ApiRoutes.Motion
|
||||||
|
.replace(':id', this.account.id!)
|
||||||
|
.replace(':motionId', this.motion.id!);
|
||||||
|
|
||||||
|
this.httpClient.delete<MotionModel>(url)
|
||||||
|
.subscribe(data => {
|
||||||
|
resolve(data);
|
||||||
|
}, error => {
|
||||||
|
Swal.showValidationMessage(error.detail);
|
||||||
|
reject();
|
||||||
|
});
|
||||||
|
|
||||||
|
}).catch(x => {
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
allowOutsideClick: () => !Swal.isLoading(),
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
this.onDelete?.emit((result.value! as MotionModel));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
import() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addDay(days: number) {
|
addDay(days: number) {
|
||||||
|
|||||||
@@ -42,6 +42,10 @@ const routes: Routes = [
|
|||||||
path: 'account-category/:id',
|
path: 'account-category/:id',
|
||||||
component: AccountListComponent,
|
component: AccountListComponent,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'account-category/:id/account/:accountId',
|
||||||
|
component: AccountListComponent,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ import { MotionComponent } from './accounts/motion.component';
|
|||||||
MatCardModule,
|
MatCardModule,
|
||||||
MatExpansionModule,
|
MatExpansionModule,
|
||||||
NgxMaskModule,
|
NgxMaskModule,
|
||||||
NgxCurrencyModule,
|
NgxCurrencyModule
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: MAT_DATE_LOCALE, useValue: 'en-GB' },
|
{ provide: MAT_DATE_LOCALE, useValue: 'en-GB' },
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ export class SettingsAccountCategoryComponent {
|
|||||||
|
|
||||||
public remove(category: AccountCategoryModel) {
|
public remove(category: AccountCategoryModel) {
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
title: 'Remove account category ' + category.name,
|
title: 'Delete account category ' + category.name,
|
||||||
showCancelButton: true,
|
showCancelButton: true,
|
||||||
confirmButtonText: 'Delete',
|
confirmButtonText: 'Delete',
|
||||||
showLoaderOnConfirm: true,
|
showLoaderOnConfirm: true,
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ export class SettingsItemCategoryComponent {
|
|||||||
|
|
||||||
public remove(category: ItemCategoryModel) {
|
public remove(category: ItemCategoryModel) {
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
title: 'Remove item category ' + category.name,
|
title: 'Delete item category ' + category.name,
|
||||||
showCancelButton: true,
|
showCancelButton: true,
|
||||||
confirmButtonText: 'Delete',
|
confirmButtonText: 'Delete',
|
||||||
showLoaderOnConfirm: true,
|
showLoaderOnConfirm: true,
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ export class SettingsItemComponent {
|
|||||||
|
|
||||||
public remove(category: ItemModel) {
|
public remove(category: ItemModel) {
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
title: 'Remove item from ' + category.name,
|
title: 'Delete item from ' + category.name,
|
||||||
showCancelButton: true,
|
showCancelButton: true,
|
||||||
confirmButtonText: 'Delete',
|
confirmButtonText: 'Delete',
|
||||||
showLoaderOnConfirm: true,
|
showLoaderOnConfirm: true,
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
using Data.Repositories.Account;
|
using Data.Repositories.Account;
|
||||||
using Data.Repositories.Currency;
|
using Data.Repositories.Currency;
|
||||||
using Data.Repositories.Item;
|
using Data.Repositories.Item;
|
||||||
|
using Item;
|
||||||
|
using Item.Domain;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using MyOffice.Services.Account.Domain;
|
using MyOffice.Services.Account.Domain;
|
||||||
|
|
||||||
@@ -20,7 +22,8 @@
|
|||||||
private readonly IAccountAccountCategoryRepository _accountAccountCategoryRepository;
|
private readonly IAccountAccountCategoryRepository _accountAccountCategoryRepository;
|
||||||
private readonly IMotionRepository _motionRepository;
|
private readonly IMotionRepository _motionRepository;
|
||||||
private readonly IItemRepository _itemRepository;
|
private readonly IItemRepository _itemRepository;
|
||||||
private readonly IItemGlobalRepository _motionGlobalRepository;
|
private readonly IItemGlobalRepository _itemGlobalRepository;
|
||||||
|
private readonly ItemService _itemService;
|
||||||
|
|
||||||
public AccountService(
|
public AccountService(
|
||||||
ILogger<AccountService> logger,
|
ILogger<AccountService> logger,
|
||||||
@@ -30,7 +33,8 @@
|
|||||||
IAccountAccountCategoryRepository accountAccountCategoryRepository,
|
IAccountAccountCategoryRepository accountAccountCategoryRepository,
|
||||||
IMotionRepository motionRepository,
|
IMotionRepository motionRepository,
|
||||||
IItemRepository itemRepository,
|
IItemRepository itemRepository,
|
||||||
IItemGlobalRepository motionGlobalRepository
|
IItemGlobalRepository itemGlobalRepository,
|
||||||
|
ItemService itemService
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
@@ -40,7 +44,8 @@
|
|||||||
_accountAccountCategoryRepository = accountAccountCategoryRepository;
|
_accountAccountCategoryRepository = accountAccountCategoryRepository;
|
||||||
_motionRepository = motionRepository;
|
_motionRepository = motionRepository;
|
||||||
_itemRepository = itemRepository;
|
_itemRepository = itemRepository;
|
||||||
_motionGlobalRepository = motionGlobalRepository;
|
_itemGlobalRepository = itemGlobalRepository;
|
||||||
|
_itemService = itemService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<AccountCategory> GetAllCategories(Guid userId)
|
public List<AccountCategory> GetAllCategories(Guid userId)
|
||||||
@@ -282,7 +287,7 @@
|
|||||||
public Exec<Motion, MotionAddResult> MotionAdd(
|
public Exec<Motion, MotionAddResult> MotionAdd(
|
||||||
Guid userId,
|
Guid userId,
|
||||||
Guid accountId,
|
Guid accountId,
|
||||||
MotionAdd motion
|
MotionAddUpdate motion
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (motion == null)
|
if (motion == null)
|
||||||
@@ -298,31 +303,10 @@
|
|||||||
return result.Set(MotionAddResult.account_not_found);
|
return result.Set(MotionAddResult.account_not_found);
|
||||||
}
|
}
|
||||||
|
|
||||||
var motionGlobal = _motionGlobalRepository.GetByName(motion.Motion);
|
var itemExec = _itemService.GetOrCreate(userId, motion.Motion);
|
||||||
if (motionGlobal == null)
|
if (itemExec.Status != ItemGetOrAddResult.success)
|
||||||
{
|
{
|
||||||
// add global motion
|
return result.Set(MotionAddResult.failure);
|
||||||
motionGlobal = new ItemGlobal
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid(),
|
|
||||||
Name = motion.Motion.Trim(),
|
|
||||||
};
|
|
||||||
if (!_motionGlobalRepository.Add(motionGlobal))
|
|
||||||
{
|
|
||||||
return result.Set(MotionAddResult.failure);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var item = _itemRepository.GetByGlobal(userId, motionGlobal.Id);
|
|
||||||
if (item == null)
|
|
||||||
{
|
|
||||||
// add item
|
|
||||||
item = new Item
|
|
||||||
{
|
|
||||||
CategoryId = userId,
|
|
||||||
ItemGlobalId = motionGlobal.Id,
|
|
||||||
};
|
|
||||||
_itemRepository.Add(item);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var motionDb = new Motion
|
var motionDb = new Motion
|
||||||
@@ -331,7 +315,7 @@
|
|||||||
CreatedOn = DateTime.UtcNow,
|
CreatedOn = DateTime.UtcNow,
|
||||||
DateTime = motion.Date,
|
DateTime = motion.Date,
|
||||||
AccountId = account.Id,
|
AccountId = account.Id,
|
||||||
ItemId = item.Id,
|
ItemId = itemExec.Result!.Id,
|
||||||
AmountPlus = motion.Plus,
|
AmountPlus = motion.Plus,
|
||||||
AmountMinus = motion.Minus,
|
AmountMinus = motion.Minus,
|
||||||
Description = motion.Description,
|
Description = motion.Description,
|
||||||
@@ -343,12 +327,52 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
item.ItemGlobal = motionGlobal;
|
motionDb.Item = itemExec.Result!;
|
||||||
motionDb.Item = item;
|
|
||||||
|
|
||||||
return result.Set(motionDb);
|
return result.Set(motionDb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Exec<Motion, MotionUpdateResult> MotionUpdate(
|
||||||
|
Guid userId,
|
||||||
|
Guid accountId,
|
||||||
|
Guid motionId,
|
||||||
|
MotionAddUpdate motion
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (motion == null)
|
||||||
|
throw new ArgumentNullException(nameof(motion));
|
||||||
|
if (motion.Motion == null)
|
||||||
|
throw new ArgumentNullException(nameof(motion.Motion));
|
||||||
|
|
||||||
|
var result = new Exec<Motion, MotionUpdateResult>(MotionUpdateResult.success);
|
||||||
|
|
||||||
|
var exists = _motionRepository.Get(userId, motionId);
|
||||||
|
if (exists == null || exists.AccountId != accountId)
|
||||||
|
{
|
||||||
|
return result.Set(MotionUpdateResult.not_found);
|
||||||
|
}
|
||||||
|
|
||||||
|
var itemExec = _itemService.GetOrCreate(userId, motion.Motion);
|
||||||
|
if (itemExec.Status != ItemGetOrAddResult.success)
|
||||||
|
{
|
||||||
|
return result.Set(MotionUpdateResult.failure);
|
||||||
|
}
|
||||||
|
|
||||||
|
exists.Item.Id = itemExec.Result!.Id;
|
||||||
|
exists.DateTime = motion.Date;
|
||||||
|
exists.Description = motion.Description;
|
||||||
|
exists.AmountPlus = motion.Plus;
|
||||||
|
exists.AmountMinus = motion.Minus;
|
||||||
|
|
||||||
|
if (!_motionRepository.Update(exists))
|
||||||
|
{
|
||||||
|
return result.Set(MotionUpdateResult.failure);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.Set(exists);
|
||||||
|
}
|
||||||
|
|
||||||
public Exec<List<Motion>, GeneralExecStatus> GetMotions(
|
public Exec<List<Motion>, GeneralExecStatus> GetMotions(
|
||||||
Guid userId,
|
Guid userId,
|
||||||
Guid accountId,
|
Guid accountId,
|
||||||
@@ -368,5 +392,27 @@
|
|||||||
|
|
||||||
return result.Set(motions);
|
return result.Set(motions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Exec<Motion, MotionDeleteResult> MotionRemove(
|
||||||
|
Guid userId,
|
||||||
|
Guid accountId,
|
||||||
|
Guid motionId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
var result = new Exec<Motion, MotionDeleteResult>(MotionDeleteResult.success);
|
||||||
|
|
||||||
|
var exists = _motionRepository.Get(userId, motionId);
|
||||||
|
if (exists == null || exists.AccountId != accountId)
|
||||||
|
{
|
||||||
|
return result.Set(MotionDeleteResult.not_found);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_motionRepository.Remove(exists))
|
||||||
|
{
|
||||||
|
return result.Set(MotionDeleteResult.failure);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.Set(exists);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,4 +5,4 @@ public enum MotionAddResult
|
|||||||
success,
|
success,
|
||||||
failure,
|
failure,
|
||||||
account_not_found,
|
account_not_found,
|
||||||
}
|
}
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
namespace MyOffice.Services.Account.Domain
|
namespace MyOffice.Services.Account.Domain
|
||||||
{
|
{
|
||||||
public class MotionAdd
|
public class MotionAddUpdate
|
||||||
{
|
{
|
||||||
public DateTime Date { get; set; }
|
public DateTime Date { get; set; }
|
||||||
public string Motion { get; set; } = null!;
|
public string Motion { get; set; } = null!;
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace MyOffice.Services.Account.Domain;
|
||||||
|
|
||||||
|
public enum MotionDeleteResult
|
||||||
|
{
|
||||||
|
success,
|
||||||
|
failure,
|
||||||
|
not_found,
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace MyOffice.Services.Account.Domain;
|
||||||
|
|
||||||
|
public enum MotionUpdateResult
|
||||||
|
{
|
||||||
|
success,
|
||||||
|
failure,
|
||||||
|
not_found,
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
namespace MyOffice.Services.Item.Domain
|
||||||
|
{
|
||||||
|
public enum ItemGetOrAddResult
|
||||||
|
{
|
||||||
|
success,
|
||||||
|
failure,
|
||||||
|
not_found,
|
||||||
|
accounts_exists,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,29 +3,35 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Xml.Linq;
|
||||||
using Domain;
|
using Domain;
|
||||||
using MyOffice.Core;
|
using MyOffice.Core;
|
||||||
|
using MyOffice.Data.Models.Accounts;
|
||||||
using MyOffice.Data.Models.Items;
|
using MyOffice.Data.Models.Items;
|
||||||
using MyOffice.Data.Repositories.Item;
|
using MyOffice.Data.Repositories.Item;
|
||||||
|
using MyOffice.Services.Account.Domain;
|
||||||
|
|
||||||
public class ItemService
|
public class ItemService
|
||||||
{
|
{
|
||||||
private readonly IItemCategoryRepository _motionCategoryRepository;
|
private readonly IItemCategoryRepository _itemCategoryRepository;
|
||||||
private readonly IItemRepository _motionRepository;
|
private readonly IItemRepository _itemRepository;
|
||||||
|
private readonly IItemGlobalRepository _itemGlobalRepository;
|
||||||
|
|
||||||
public ItemService(
|
public ItemService(
|
||||||
IItemCategoryRepository motionCategoryRepository,
|
IItemCategoryRepository itemCategoryRepository,
|
||||||
IItemRepository motionRepository
|
IItemRepository itemRepository,
|
||||||
|
IItemGlobalRepository itemGlobalRepository
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_motionCategoryRepository = motionCategoryRepository;
|
_itemCategoryRepository = itemCategoryRepository;
|
||||||
_motionRepository = motionRepository;
|
_itemRepository = itemRepository;
|
||||||
|
_itemGlobalRepository = itemGlobalRepository;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ItemCategory> GetAllCategories(Guid userId)
|
public List<ItemCategory> GetAllCategories(Guid userId)
|
||||||
{
|
{
|
||||||
var result = _motionCategoryRepository.GetAll(userId);
|
var result = _itemCategoryRepository.GetAll(userId);
|
||||||
if (result.All(x => x.Id != userId))
|
if (result.All(x => x.Id != userId))
|
||||||
{
|
{
|
||||||
var category = new ItemCategory
|
var category = new ItemCategory
|
||||||
@@ -34,9 +40,9 @@
|
|||||||
UserId = userId,
|
UserId = userId,
|
||||||
Name = "UnCategorized",
|
Name = "UnCategorized",
|
||||||
};
|
};
|
||||||
_motionCategoryRepository.Add(category);
|
_itemCategoryRepository.Add(category);
|
||||||
|
|
||||||
result.Add(_motionCategoryRepository.Get(userId, userId)!);
|
result.Add(_itemCategoryRepository.Get(userId, userId)!);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -51,7 +57,7 @@
|
|||||||
category.Id = Guid.NewGuid();
|
category.Id = Guid.NewGuid();
|
||||||
category.UserId = userId;
|
category.UserId = userId;
|
||||||
|
|
||||||
if (!_motionCategoryRepository.Add(category))
|
if (!_itemCategoryRepository.Add(category))
|
||||||
{
|
{
|
||||||
return result.Set(GeneralExecStatus.failure);
|
return result.Set(GeneralExecStatus.failure);
|
||||||
}
|
}
|
||||||
@@ -66,7 +72,7 @@
|
|||||||
|
|
||||||
var result = new Exec<ItemCategory, GeneralExecStatus>(GeneralExecStatus.success);
|
var result = new Exec<ItemCategory, GeneralExecStatus>(GeneralExecStatus.success);
|
||||||
|
|
||||||
var exists = _motionCategoryRepository.Get(userId, id);
|
var exists = _itemCategoryRepository.Get(userId, id);
|
||||||
if (exists == null)
|
if (exists == null)
|
||||||
{
|
{
|
||||||
return result.Set(GeneralExecStatus.not_found);
|
return result.Set(GeneralExecStatus.not_found);
|
||||||
@@ -74,7 +80,7 @@
|
|||||||
|
|
||||||
exists.Name = category.Name;
|
exists.Name = category.Name;
|
||||||
|
|
||||||
if (!_motionCategoryRepository.Update(exists))
|
if (!_itemCategoryRepository.Update(exists))
|
||||||
{
|
{
|
||||||
return result.Set(GeneralExecStatus.failure);
|
return result.Set(GeneralExecStatus.failure);
|
||||||
}
|
}
|
||||||
@@ -86,7 +92,7 @@
|
|||||||
{
|
{
|
||||||
var result = new Exec<ItemCategory, ItemCategoryRemoveResult>(ItemCategoryRemoveResult.success);
|
var result = new Exec<ItemCategory, ItemCategoryRemoveResult>(ItemCategoryRemoveResult.success);
|
||||||
|
|
||||||
var exists = _motionCategoryRepository.Get(userId, id);
|
var exists = _itemCategoryRepository.Get(userId, id);
|
||||||
if (exists == null)
|
if (exists == null)
|
||||||
{
|
{
|
||||||
return result.Set(ItemCategoryRemoveResult.not_found);
|
return result.Set(ItemCategoryRemoveResult.not_found);
|
||||||
@@ -96,7 +102,7 @@
|
|||||||
{
|
{
|
||||||
return result.Set(ItemCategoryRemoveResult.accounts_exists);
|
return result.Set(ItemCategoryRemoveResult.accounts_exists);
|
||||||
}
|
}
|
||||||
if (!_motionCategoryRepository.Remove(exists))
|
if (!_itemCategoryRepository.Remove(exists))
|
||||||
{
|
{
|
||||||
return result.Set(ItemCategoryRemoveResult.failure);
|
return result.Set(ItemCategoryRemoveResult.failure);
|
||||||
}
|
}
|
||||||
@@ -106,19 +112,19 @@
|
|||||||
|
|
||||||
public List<Item> GetAll(Guid userId)
|
public List<Item> GetAll(Guid userId)
|
||||||
{
|
{
|
||||||
return _motionRepository.GetAll(userId);
|
return _itemRepository.GetAll(userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Item> GetByCategory(Guid userId, Guid categoryId)
|
public List<Item> GetByCategory(Guid userId, Guid categoryId)
|
||||||
{
|
{
|
||||||
return _motionRepository.GetByCategory(userId, categoryId);
|
return _itemRepository.GetByCategory(userId, categoryId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Exec<Item, GeneralExecStatus> Update(Guid userId, Guid motionId, Guid categoryId)
|
public Exec<Item, GeneralExecStatus> Update(Guid userId, Guid motionId, Guid categoryId)
|
||||||
{
|
{
|
||||||
var result = new Exec<Item, GeneralExecStatus>(GeneralExecStatus.success);
|
var result = new Exec<Item, GeneralExecStatus>(GeneralExecStatus.success);
|
||||||
|
|
||||||
var motion = _motionRepository.GetByGlobal(userId, motionId);
|
var motion = _itemRepository.GetByGlobal(userId, motionId);
|
||||||
if (motion == null)
|
if (motion == null)
|
||||||
{
|
{
|
||||||
return result.Set(GeneralExecStatus.not_found);
|
return result.Set(GeneralExecStatus.not_found);
|
||||||
@@ -126,9 +132,60 @@
|
|||||||
|
|
||||||
motion.Category.Id = categoryId;
|
motion.Category.Id = categoryId;
|
||||||
//motion.CategoryId = categoryId;
|
//motion.CategoryId = categoryId;
|
||||||
_motionRepository.Update(motion);
|
_itemRepository.Update(motion);
|
||||||
|
|
||||||
return result.Set(motion);
|
return result.Set(motion);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Exec<Item, ItemGetOrAddResult> GetOrCreate(Guid userId, string name)
|
||||||
|
{
|
||||||
|
if (name == null)
|
||||||
|
throw new ArgumentNullException(nameof(name));
|
||||||
|
|
||||||
|
var result = new Exec<Item, ItemGetOrAddResult>(ItemGetOrAddResult.success);
|
||||||
|
|
||||||
|
var itemGlobal = _itemGlobalRepository.GetByName(name);
|
||||||
|
if (itemGlobal == null)
|
||||||
|
{
|
||||||
|
// add global motion
|
||||||
|
itemGlobal = new ItemGlobal
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid(),
|
||||||
|
Name = name.Trim(),
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!_itemGlobalRepository.Add(itemGlobal))
|
||||||
|
{
|
||||||
|
return result.Set(ItemGetOrAddResult.failure);
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetOrCreate(userId, itemGlobal);
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetOrCreate(userId, itemGlobal);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Exec<Item, ItemGetOrAddResult> GetOrCreate(Guid userId, ItemGlobal itemGlobal)
|
||||||
|
{
|
||||||
|
if (itemGlobal == null)
|
||||||
|
throw new ArgumentNullException(nameof(itemGlobal));
|
||||||
|
|
||||||
|
var result = new Exec<Item, ItemGetOrAddResult>(ItemGetOrAddResult.success);
|
||||||
|
|
||||||
|
var item = _itemRepository.GetByGlobal(userId, itemGlobal.Id);
|
||||||
|
if (item == null)
|
||||||
|
{
|
||||||
|
// add item to UnCategorized category
|
||||||
|
item = new Item
|
||||||
|
{
|
||||||
|
CategoryId = userId,
|
||||||
|
ItemGlobalId = itemGlobal.Id,
|
||||||
|
};
|
||||||
|
_itemRepository.Add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
item.ItemGlobal = itemGlobal;
|
||||||
|
return result.Set(item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ using Microsoft.AspNetCore.Mvc;
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Models.Account;
|
using Models.Account;
|
||||||
using Models.Motion;
|
using Models.Motion;
|
||||||
using MyOffice.Data.Models.Accounts;
|
|
||||||
using MyOffice.Web.Models.AccountMotion;
|
|
||||||
using Services.Account;
|
using Services.Account;
|
||||||
using Services.Account.Domain;
|
using Services.Account.Domain;
|
||||||
|
|
||||||
@@ -59,7 +57,7 @@ public class AccountController : BaseApiController
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("~/api/accounts/{id}/motions")]
|
[HttpGet("~/api/accounts/{id}/motions")]
|
||||||
public object AccountMotionsGet(string id, [FromQuery] AccountMotionsGetModel request)
|
public object MotionsGet(string id, [FromQuery] MotionsGetModel request)
|
||||||
{
|
{
|
||||||
var exec = _accountService.GetMotions(UserId, id!.AsGuid(), request.From.StartOfDay(), request.To.EndOfDay());
|
var exec = _accountService.GetMotions(UserId, id!.AsGuid(), request.From.StartOfDay(), request.To.EndOfDay());
|
||||||
|
|
||||||
@@ -78,7 +76,7 @@ public class AccountController : BaseApiController
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("~/api/accounts/{id}/motions")]
|
[HttpPost("~/api/accounts/{id}/motions")]
|
||||||
public object AccountsMotionsPost(string id, MotionRequest motion)
|
public object MotionsPost(string id, MotionRequest motion)
|
||||||
{
|
{
|
||||||
var exec = _accountService.MotionAdd(UserId, id.AsGuid(), motion.FromModel());
|
var exec = _accountService.MotionAdd(UserId, id.AsGuid(), motion.FromModel());
|
||||||
|
|
||||||
@@ -95,4 +93,42 @@ public class AccountController : BaseApiController
|
|||||||
throw new NotSupportedException(exec.Status.ToString());
|
throw new NotSupportedException(exec.Status.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpPut("~/api/accounts/{id}/motions/{motionId}")]
|
||||||
|
public object MotionsPut(string id, string motionId, MotionRequest motion)
|
||||||
|
{
|
||||||
|
var exec = _accountService.MotionUpdate(UserId, id.AsGuid(), motionId.AsGuid(), motion.FromModel());
|
||||||
|
|
||||||
|
switch (exec.Status)
|
||||||
|
{
|
||||||
|
case MotionUpdateResult.not_found:
|
||||||
|
return ProblemBadRequest("Motion not found.");
|
||||||
|
case MotionUpdateResult.failure:
|
||||||
|
return ProblemBadRequest("Updating motion failed.");
|
||||||
|
case MotionUpdateResult.success:
|
||||||
|
return exec.Result!.ToModel();
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new NotSupportedException(exec.Status.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpDelete("~/api/accounts/{id}/motions/{motionId}")]
|
||||||
|
public object MotionsDelete(string id, string motionId)
|
||||||
|
{
|
||||||
|
var exec = _accountService.MotionRemove(UserId, id.AsGuid(), motionId.AsGuid());
|
||||||
|
|
||||||
|
switch (exec.Status)
|
||||||
|
{
|
||||||
|
case MotionDeleteResult.not_found:
|
||||||
|
return ProblemBadRequest("Motion not found.");
|
||||||
|
case MotionDeleteResult.failure:
|
||||||
|
return ProblemBadRequest("Deliting motion failed.");
|
||||||
|
case MotionDeleteResult.success:
|
||||||
|
return exec.Result!.ToModel();
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new NotSupportedException(exec.Status.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
public class AccountMotionsGetModel
|
public class MotionsGetModel
|
||||||
{
|
{
|
||||||
[Required]
|
[Required]
|
||||||
public DateTime From { get; set; }
|
public DateTime From { get; set; }
|
||||||
@@ -13,9 +13,9 @@ public class MotionRequest
|
|||||||
|
|
||||||
public static class MotionRequestExtension
|
public static class MotionRequestExtension
|
||||||
{
|
{
|
||||||
public static MotionAdd FromModel(this MotionRequest input)
|
public static MotionAddUpdate FromModel(this MotionRequest input)
|
||||||
{
|
{
|
||||||
return new MotionAdd
|
return new MotionAddUpdate
|
||||||
{
|
{
|
||||||
Date = input.Date,
|
Date = input.Date,
|
||||||
Motion = input.Motion,
|
Motion = input.Motion,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace MyOffice.Web.Models.AccountMotion
|
namespace MyOffice.Web.Models.Motion
|
||||||
{
|
{
|
||||||
using Core.Extensions;
|
using Core.Extensions;
|
||||||
using Data.Models.Accounts;
|
using Data.Models.Accounts;
|
||||||
|
|||||||
Reference in New Issue
Block a user