├── src ├── client │ ├── src │ │ ├── assets │ │ │ ├── .gitkeep │ │ │ ├── fluentpos_logo.png │ │ │ └── images │ │ │ │ ├── bg-login.jpg │ │ │ │ └── 50124-user-profile.gif │ │ ├── app │ │ │ ├── core │ │ │ │ ├── models │ │ │ │ │ ├── identity │ │ │ │ │ │ ├── user.ts │ │ │ │ │ │ ├── refreshTokenRequest.ts │ │ │ │ │ │ └── token.ts │ │ │ │ │ ├── uploads │ │ │ │ │ │ ├── upload-type.ts │ │ │ │ │ │ └── upload.ts │ │ │ │ │ ├── cart │ │ │ │ │ │ ├── cart.ts │ │ │ │ │ │ └── cart-item.ts │ │ │ │ │ ├── Filters │ │ │ │ │ │ └── PaginatedFilter.ts │ │ │ │ │ ├── wrappers │ │ │ │ │ │ ├── IResult.ts │ │ │ │ │ │ ├── Result.ts │ │ │ │ │ │ └── PaginatedResult.ts │ │ │ │ │ └── event-logs │ │ │ │ │ │ └── event-log.ts │ │ │ │ ├── shared │ │ │ │ │ └── components │ │ │ │ │ │ ├── uploader │ │ │ │ │ │ ├── uploader.component.scss │ │ │ │ │ │ └── uploader.component.html │ │ │ │ │ │ ├── delete-dialog │ │ │ │ │ │ ├── delete-dialog.component.scss │ │ │ │ │ │ ├── delete-dialog.component.html │ │ │ │ │ │ └── delete-dialog.component.ts │ │ │ │ │ │ ├── logout-dialog │ │ │ │ │ │ ├── logout-dialog.component.scss │ │ │ │ │ │ ├── logout-dialog.component.html │ │ │ │ │ │ ├── logout-dialog.component.ts │ │ │ │ │ │ └── logout-dialog.component.spec.ts │ │ │ │ │ │ ├── table │ │ │ │ │ │ ├── table-column.ts │ │ │ │ │ │ ├── custom-action.ts │ │ │ │ │ │ └── table.component.scss │ │ │ │ │ │ ├── not-found │ │ │ │ │ │ ├── not-found.component.ts │ │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ │ └── not-found.component.html │ │ │ │ │ │ ├── server-error │ │ │ │ │ │ ├── server-error.component.ts │ │ │ │ │ │ ├── server-error.component.scss │ │ │ │ │ │ └── server-error.component.html │ │ │ │ │ │ └── access-denial │ │ │ │ │ │ ├── access-denial.component.ts │ │ │ │ │ │ ├── access-denial.component.scss │ │ │ │ │ │ └── access-denial.component.html │ │ │ │ ├── pipes │ │ │ │ │ └── data-property-getter.pipe.ts │ │ │ │ ├── services │ │ │ │ │ ├── busy.service.ts │ │ │ │ │ ├── local-storage.service.ts │ │ │ │ │ └── multilingual.service.ts │ │ │ │ ├── api │ │ │ │ │ ├── checkout │ │ │ │ │ │ └── checkout-api.service.ts │ │ │ │ │ ├── sales │ │ │ │ │ │ └── sales-api.service.ts │ │ │ │ │ ├── event-logs │ │ │ │ │ │ └── event-log-api.service.ts │ │ │ │ │ ├── catalog │ │ │ │ │ │ ├── brand-api.service.ts │ │ │ │ │ │ └── category-api.service.ts │ │ │ │ │ └── cart │ │ │ │ │ │ └── cart-api.service.ts │ │ │ │ ├── guards │ │ │ │ │ └── auth.guard.ts │ │ │ │ └── directives │ │ │ │ │ ├── has-role.directive.ts │ │ │ │ │ └── has-permission.directive.ts │ │ │ ├── modules │ │ │ │ ├── admin │ │ │ │ │ ├── catalog │ │ │ │ │ │ ├── catalog.component.scss │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── brand │ │ │ │ │ │ │ │ ├── brand.component.scss │ │ │ │ │ │ │ │ ├── brand-form │ │ │ │ │ │ │ │ │ └── brand-form.component.scss │ │ │ │ │ │ │ │ └── brand.component.html │ │ │ │ │ │ │ ├── product │ │ │ │ │ │ │ │ ├── product.component.scss │ │ │ │ │ │ │ │ ├── product-form │ │ │ │ │ │ │ │ │ └── product-form.component.scss │ │ │ │ │ │ │ │ └── product.component.html │ │ │ │ │ │ │ └── category │ │ │ │ │ │ │ │ ├── category.component.scss │ │ │ │ │ │ │ │ ├── category-form │ │ │ │ │ │ │ │ └── category-form.component.scss │ │ │ │ │ │ │ │ └── category.component.html │ │ │ │ │ │ ├── catalog.component.html │ │ │ │ │ │ ├── models │ │ │ │ │ │ │ ├── brand.ts │ │ │ │ │ │ │ ├── category.ts │ │ │ │ │ │ │ ├── brandParams.ts │ │ │ │ │ │ │ ├── categoryParams.ts │ │ │ │ │ │ │ ├── productParams.ts │ │ │ │ │ │ │ └── product.ts │ │ │ │ │ │ └── catalog.component.ts │ │ │ │ │ ├── people │ │ │ │ │ │ ├── people.component.scss │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── customer │ │ │ │ │ │ │ │ ├── customer.component.scss │ │ │ │ │ │ │ │ ├── customer-form │ │ │ │ │ │ │ │ │ └── customer-form.component.scss │ │ │ │ │ │ │ │ └── customer.component.html │ │ │ │ │ │ │ └── supplier │ │ │ │ │ │ │ │ ├── supplier.component.scss │ │ │ │ │ │ │ │ ├── supplier.component.html │ │ │ │ │ │ │ │ └── supplier.component.ts │ │ │ │ │ │ ├── people.component.html │ │ │ │ │ │ ├── models │ │ │ │ │ │ │ ├── customer.ts │ │ │ │ │ │ │ └── customerParams.ts │ │ │ │ │ │ ├── people.component.ts │ │ │ │ │ │ └── people-routing.module.ts │ │ │ │ │ ├── sales │ │ │ │ │ │ ├── sales.component.scss │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ └── order │ │ │ │ │ │ │ │ ├── order.component.scss │ │ │ │ │ │ │ │ └── order-detail │ │ │ │ │ │ │ │ ├── order-detail.component.scss │ │ │ │ │ │ │ │ └── order-detail.component.ts │ │ │ │ │ │ ├── sales.component.html │ │ │ │ │ │ ├── models │ │ │ │ │ │ │ ├── product.ts │ │ │ │ │ │ │ ├── orderParams.ts │ │ │ │ │ │ │ └── order.ts │ │ │ │ │ │ ├── sales.component.ts │ │ │ │ │ │ ├── sales-routing.module.ts │ │ │ │ │ │ └── sales.module.ts │ │ │ │ │ ├── dashboard │ │ │ │ │ │ ├── dashboard.component.scss │ │ │ │ │ │ ├── dashboard.component.html │ │ │ │ │ │ └── dashboard.component.ts │ │ │ │ │ ├── identity │ │ │ │ │ │ ├── identity.component.scss │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── role │ │ │ │ │ │ │ │ ├── role.component.scss │ │ │ │ │ │ │ │ ├── role-form │ │ │ │ │ │ │ │ │ └── role-form.component.scss │ │ │ │ │ │ │ │ ├── role-permission-form │ │ │ │ │ │ │ │ │ └── role-permission-form.component.scss │ │ │ │ │ │ │ │ └── role.component.html │ │ │ │ │ │ │ ├── user │ │ │ │ │ │ │ │ ├── user.component.scss │ │ │ │ │ │ │ │ ├── user-role-form │ │ │ │ │ │ │ │ │ ├── user-role-form.component.scss │ │ │ │ │ │ │ │ │ └── user-role-form.component.html │ │ │ │ │ │ │ │ ├── user-form │ │ │ │ │ │ │ │ │ └── user-form.component.scss │ │ │ │ │ │ │ │ └── user.component.html │ │ │ │ │ │ │ └── profile │ │ │ │ │ │ │ │ ├── profile.component.scss │ │ │ │ │ │ │ │ └── profile.component.ts │ │ │ │ │ │ ├── identity.component.html │ │ │ │ │ │ ├── models │ │ │ │ │ │ │ ├── role.ts │ │ │ │ │ │ │ ├── resetPassword.ts │ │ │ │ │ │ │ ├── identityParams.ts │ │ │ │ │ │ │ ├── userRole.ts │ │ │ │ │ │ │ ├── roleParams.ts │ │ │ │ │ │ │ ├── userParams.ts │ │ │ │ │ │ │ ├── permission.ts │ │ │ │ │ │ │ └── user.ts │ │ │ │ │ │ └── identity.component.ts │ │ │ │ │ ├── settings │ │ │ │ │ │ ├── settings.component.scss │ │ │ │ │ │ ├── settings.module.ts │ │ │ │ │ │ └── settings.component.ts │ │ │ │ │ ├── shared │ │ │ │ │ │ └── components │ │ │ │ │ │ │ └── delete-dialog │ │ │ │ │ │ │ ├── delete-dialog.component.scss │ │ │ │ │ │ │ ├── delete-dialog.component.html │ │ │ │ │ │ │ ├── delete-dialog.component.ts │ │ │ │ │ │ │ └── delete-dialog.component.spec.ts │ │ │ │ │ ├── event-logs │ │ │ │ │ │ ├── event-logs.component.scss │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ └── event-log-details │ │ │ │ │ │ │ │ └── event-log-details.component.scss │ │ │ │ │ │ ├── models │ │ │ │ │ │ │ └── eventLogParams.ts │ │ │ │ │ │ ├── event-logs.component.html │ │ │ │ │ │ └── event-logs.module.ts │ │ │ │ │ └── about │ │ │ │ │ │ ├── about.module.ts │ │ │ │ │ │ └── about.component.ts │ │ │ │ ├── home │ │ │ │ │ ├── welcome │ │ │ │ │ │ └── welcome.component.scss │ │ │ │ │ ├── home-routing.module.ts │ │ │ │ │ └── home.module.ts │ │ │ │ ├── pos │ │ │ │ │ ├── components │ │ │ │ │ │ ├── checkout │ │ │ │ │ │ │ └── checkout.component.scss │ │ │ │ │ │ ├── customer │ │ │ │ │ │ │ └── customer.component.scss │ │ │ │ │ │ ├── product-info │ │ │ │ │ │ │ ├── product-info.component.scss │ │ │ │ │ │ │ ├── product-info.component.html │ │ │ │ │ │ │ └── product-info.component.ts │ │ │ │ │ │ ├── cart-skeleton │ │ │ │ │ │ │ ├── cart-skeleton.component.scss │ │ │ │ │ │ │ └── cart-skeleton.component.ts │ │ │ │ │ │ ├── customer-carts │ │ │ │ │ │ │ ├── customer-carts.component.scss │ │ │ │ │ │ │ ├── customer-carts.component.html │ │ │ │ │ │ │ └── customer-carts.component.ts │ │ │ │ │ │ ├── customer-info │ │ │ │ │ │ │ ├── customer-info.component.scss │ │ │ │ │ │ │ ├── customer-info.component.html │ │ │ │ │ │ │ └── customer-info.component.ts │ │ │ │ │ │ ├── catalog-skeleton │ │ │ │ │ │ │ ├── catalog-skeleton.component.scss │ │ │ │ │ │ │ └── catalog-skeleton.component.ts │ │ │ │ │ │ ├── customer-selection │ │ │ │ │ │ │ └── customer-selection.component.scss │ │ │ │ │ │ ├── pos-toolbar │ │ │ │ │ │ │ └── pos-toolbar.component.scss │ │ │ │ │ │ ├── catalog │ │ │ │ │ │ │ └── catalog.component.scss │ │ │ │ │ │ ├── cart │ │ │ │ │ │ │ └── cart.component.scss │ │ │ │ │ │ └── customer-skeleton │ │ │ │ │ │ │ ├── customer-skeleton.component.ts │ │ │ │ │ │ │ └── customer-skeleton.component.spec.ts │ │ │ │ │ ├── models │ │ │ │ │ │ ├── checkOutParams.ts │ │ │ │ │ │ ├── brand.ts │ │ │ │ │ │ ├── category.ts │ │ │ │ │ │ ├── checkOut.ts │ │ │ │ │ │ ├── customer.ts │ │ │ │ │ │ ├── brandParams.ts │ │ │ │ │ │ ├── categoryParams.ts │ │ │ │ │ │ ├── customerParams.ts │ │ │ │ │ │ ├── productParams.ts │ │ │ │ │ │ ├── product.ts │ │ │ │ │ │ └── cart.ts │ │ │ │ │ ├── pos.component.scss │ │ │ │ │ ├── pos-routing.module.ts │ │ │ │ │ ├── pos.component.html │ │ │ │ │ ├── pos.component.ts │ │ │ │ │ └── services │ │ │ │ │ │ └── checkout.service.ts │ │ │ │ └── auth │ │ │ │ │ ├── auth-routing.module.ts │ │ │ │ │ ├── auth.module.ts │ │ │ │ │ └── login │ │ │ │ │ └── login.component.scss │ │ │ ├── app.component.html │ │ │ ├── layouts │ │ │ │ ├── auth-layout │ │ │ │ │ ├── auth-layout.component.scss │ │ │ │ │ ├── auth-layout.component.html │ │ │ │ │ └── auth-layout.component.ts │ │ │ │ ├── pos-layout │ │ │ │ │ ├── pos-layout.component.html │ │ │ │ │ └── pos-layout.component.ts │ │ │ │ └── home-layout │ │ │ │ │ ├── home-layout.component.html │ │ │ │ │ ├── home-layout.component.ts │ │ │ │ │ └── home-layout.component.scss │ │ │ └── app.component.scss │ │ ├── favicon.ico │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── main.ts │ │ ├── index.html │ │ └── test.ts │ ├── .vscode │ │ ├── settings.json │ │ └── launch.json │ ├── e2e │ │ ├── src │ │ │ ├── app.po.ts │ │ │ └── app.e2e-spec.ts │ │ └── tsconfig.json │ ├── .editorconfig │ ├── tsconfig.app.json │ ├── tsconfig.spec.json │ ├── tsconfig.json │ ├── .browserslistrc │ └── .gitignore └── server │ ├── API │ ├── Bootstrapper.xml │ ├── appsettings.Development.json │ └── Properties │ │ └── launchSettings.json │ ├── Shared │ ├── Shared.DTOs │ │ ├── Sales │ │ │ └── Orders │ │ │ │ ├── PaginatedSalesFilter.cs │ │ │ │ ├── GetSalesResponse.cs │ │ │ │ ├── ProductResponse.cs │ │ │ │ └── GetOrderByIdResponse.cs │ │ ├── Filters │ │ │ └── BaseFilter.cs │ │ ├── Identity │ │ │ ├── Tokens │ │ │ │ ├── TokenRequest.cs │ │ │ │ ├── RefreshTokenRequest.cs │ │ │ │ └── TokenResponse.cs │ │ │ ├── Users │ │ │ │ └── UserRolesRequest.cs │ │ │ ├── Roles │ │ │ │ ├── RoleRequest.cs │ │ │ │ ├── RoleResponse.cs │ │ │ │ ├── PermissionRequest.cs │ │ │ │ ├── PermissionResponse.cs │ │ │ │ ├── RoleClaimRequest.cs │ │ │ │ └── RoleClaimResponse.cs │ │ │ ├── ForgotPasswordRequest.cs │ │ │ ├── ResetPasswordRequest.cs │ │ │ └── EventLogs │ │ │ │ └── LogEventRequest.cs │ │ ├── Catalogs │ │ │ ├── Brands │ │ │ │ ├── GetBrandsResponse.cs │ │ │ │ ├── GetBrandByIdResponse.cs │ │ │ │ └── PaginatedBrandFilter.cs │ │ │ ├── Categories │ │ │ │ ├── GetCategoriesResponse.cs │ │ │ │ ├── GetCategoryByIdResponse.cs │ │ │ │ └── PaginatedCategoryFilter.cs │ │ │ └── Products │ │ │ │ ├── GetProductByIdResponse.cs │ │ │ │ ├── PaginatedProductFilter.cs │ │ │ │ └── GetProductsResponse.cs │ │ ├── People │ │ │ ├── Carts │ │ │ │ ├── GetCartsResponse.cs │ │ │ │ └── PaginatedCartFilter.cs │ │ │ ├── CartItems │ │ │ │ ├── GetCartItemByIdResponse.cs │ │ │ │ ├── GetCartItemsResponse.cs │ │ │ │ └── PaginatedCartItemFilter.cs │ │ │ └── Customers │ │ │ │ ├── GetCustomersResponse.cs │ │ │ │ ├── GetCustomerByIdResponse.cs │ │ │ │ └── PaginatedCustomerFilter.cs │ │ ├── Sms │ │ │ └── SmsRequest.cs │ │ ├── Mails │ │ │ └── MailRequest.cs │ │ ├── Upload │ │ │ ├── UploadRequest.cs │ │ │ └── UploadType.cs │ │ └── ExtendedAttributes │ │ │ └── ExtendedAttributeType.cs │ └── Shared.Core │ │ ├── Interfaces │ │ ├── IModuleDbContext.cs │ │ ├── Services │ │ │ ├── IDatabaseSeeder.cs │ │ │ ├── ISmsService.cs │ │ │ ├── IMailService.cs │ │ │ ├── IUploadService.cs │ │ │ └── IJobService.cs │ │ ├── Serialization │ │ │ ├── IJsonSerializerSettingsOptions.cs │ │ │ ├── IJsonSerializerOptions.cs │ │ │ ├── IJsonSerializerSettings.cs │ │ │ └── IJsonSerializer.cs │ │ ├── IDbContext.cs │ │ └── IApplicationDbContext.cs │ │ ├── Settings │ │ ├── CorsSettings.cs │ │ ├── CacheSettings.cs │ │ ├── ApplicationSettings.cs │ │ ├── SerializationSettings.cs │ │ └── SmsSettings.cs │ │ ├── Constants │ │ ├── ApplicationClaimType.cs │ │ └── RoleConstants.cs │ │ ├── Contracts │ │ ├── IEntity.cs │ │ └── IBaseEntity.cs │ │ ├── Attributes │ │ └── SwaggerExcludeAttribute.cs │ │ ├── Domain │ │ ├── DomainEvent.cs │ │ └── Message.cs │ │ ├── Queries │ │ └── ICacheable.cs │ │ ├── IntegrationServices │ │ ├── Application │ │ │ └── IEntityReferenceService.cs │ │ ├── Catalog │ │ │ └── IProductService.cs │ │ └── People │ │ │ └── ICartService.cs │ │ ├── EventLogging │ │ └── IEventLogger.cs │ │ └── Wrapper │ │ └── IResult.cs │ ├── Modules │ ├── Sales │ │ ├── Modules.Sales.Core │ │ │ ├── Features │ │ │ │ └── Sales │ │ │ │ │ ├── Queries │ │ │ │ │ ├── GetOrderByIdQuery.cs │ │ │ │ │ └── GetSalesQuery.cs │ │ │ │ │ └── Commands │ │ │ │ │ └── RegisterSaleCommand.cs │ │ │ ├── Entities │ │ │ │ └── LedgerRecord.cs │ │ │ ├── Enums │ │ │ │ └── PaymentType.cs │ │ │ ├── Mappings │ │ │ │ └── SalesProfile.cs │ │ │ └── Exceptions │ │ │ │ └── SalesException.cs │ │ ├── Modules.Sales.Infrastructure │ │ │ └── Persistence │ │ │ │ └── Migrations │ │ │ │ └── 20210818185808_ReferenceNumber.cs │ │ └── Modules.Sales │ │ │ └── Controllers │ │ │ └── BaseController.cs │ ├── Inventory │ │ ├── Modules.Inventory.Core │ │ │ ├── Enums │ │ │ │ └── TransactionType.cs │ │ │ ├── Exceptions │ │ │ │ └── InventoryException.cs │ │ │ └── Abstractions │ │ │ │ └── IInventoryDbContext.cs │ │ └── Modules.Inventory.Infrastructure │ │ │ └── Persistence │ │ │ └── Migrations │ │ │ └── 20210818162001_added-reference.cs │ ├── Identity │ │ ├── Modules.Identity.Core │ │ │ ├── Constants │ │ │ │ └── UserConstants.cs │ │ │ ├── Entities │ │ │ │ └── ExtendedAttributes │ │ │ │ │ ├── RoleExtendedAttribute.cs │ │ │ │ │ └── UserExtendedAttribute.cs │ │ │ ├── Settings │ │ │ │ └── JwtSettings.cs │ │ │ └── Mappings │ │ │ │ └── ExtendedAttributesProfile.cs │ │ ├── Modules.Identity.Infrastructure │ │ │ ├── Mappings │ │ │ │ └── RoleProfile.cs │ │ │ └── Permissions │ │ │ │ └── PermissionRequirement.cs │ │ └── Modules.Identity │ │ │ └── Controllers │ │ │ └── BaseController.cs │ ├── People │ │ ├── Modules.People.Core │ │ │ ├── Constants │ │ │ │ └── CustomerTypes.cs │ │ │ ├── Entities │ │ │ │ └── ExtendedAttributes │ │ │ │ │ ├── CartExtendedAttribute.cs │ │ │ │ │ ├── CartItemExtendedAttribute.cs │ │ │ │ │ └── CustomerExtendedAttribute.cs │ │ │ ├── Features │ │ │ │ ├── Carts │ │ │ │ │ └── Commands │ │ │ │ │ │ ├── CreateCartCommand.cs │ │ │ │ │ │ ├── ClearCartCommand.cs │ │ │ │ │ │ └── RemoveCartCommand.cs │ │ │ │ ├── CartItems │ │ │ │ │ └── Commands │ │ │ │ │ │ ├── AddCartItemCommand.cs │ │ │ │ │ │ └── RemoveCartItemCommand.cs │ │ │ │ └── Customers │ │ │ │ │ └── Commands │ │ │ │ │ └── RemoveCustomerCommand.cs │ │ │ ├── Exceptions │ │ │ │ ├── CartNotFoundException.cs │ │ │ │ └── PeopleException.cs │ │ │ └── Mappings │ │ │ │ └── ExtendedAttributesProfile.cs │ │ └── Modules.People │ │ │ └── Controllers │ │ │ └── BaseController.cs │ └── Catalog │ │ ├── Modules.Catalog.Core │ │ ├── Entities │ │ │ └── ExtendedAttributes │ │ │ │ ├── BrandExtendedAttribute.cs │ │ │ │ ├── ProductExtendedAttribute.cs │ │ │ │ └── CategoryExtendedAttribute.cs │ │ ├── Exceptions │ │ │ └── CatalogException.cs │ │ ├── Features │ │ │ ├── Brands │ │ │ │ ├── Commands │ │ │ │ │ └── RemoveBrandCommand.cs │ │ │ │ └── Queries │ │ │ │ │ └── GetBrandImageQuery.cs │ │ │ └── Products │ │ │ │ ├── Queries │ │ │ │ └── GetProductImageQuery.cs │ │ │ │ └── Commands │ │ │ │ └── RemoveProductCommand.cs │ │ └── Mappings │ │ │ └── ExtendedAttributesProfile.cs │ │ └── Modules.Catalog │ │ └── Controllers │ │ └── BaseController.cs │ └── .vscode │ └── tasks.json ├── workspace └── fluentpos.code-workspace └── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE ├── feature_request.md └── bug_report.md └── workflows ├── angular.yml └── dotnet.yml /src/client/src/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/core/models/identity/user.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/catalog.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/people/people.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/sales/sales.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/home/welcome/welcome.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/layouts/auth-layout/auth-layout.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/dashboard/dashboard.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/identity.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/settings/settings.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/uploader/uploader.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/components/brand/brand.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/components/role/role.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/components/user/user.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/sales/components/order/order.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/checkout/checkout.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/customer/customer.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/components/product/product.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/components/profile/profile.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/people/components/customer/customer.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/people/components/supplier/supplier.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/product-info/product-info.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/delete-dialog/delete-dialog.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/logout-dialog/logout-dialog.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/components/category/category.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/cart-skeleton/cart-skeleton.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/customer-carts/customer-carts.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/customer-info/customer-info.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "angular.enable-strict-mode-prompt": false 3 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/components/role/role-form/role-form.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/shared/components/delete-dialog/delete-dialog.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/catalog-skeleton/catalog-skeleton.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/layouts/auth-layout/auth-layout.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/layouts/pos-layout/pos-layout.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/components/brand/brand-form/brand-form.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/identity.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/people/people.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/sales/components/order/order-detail/order-detail.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/sales/sales.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/customer-selection/customer-selection.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/catalog.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/components/category/category-form/category-form.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/components/product/product-form/product-form.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/components/user/user-role-form/user-role-form.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/people/components/customer/customer-form/customer-form.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/client/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chhinsras/fluentpos/HEAD/src/client/src/favicon.ico -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/people/components/supplier/supplier.component.html: -------------------------------------------------------------------------------- 1 |

supplier works!

2 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/product-info/product-info.component.html: -------------------------------------------------------------------------------- 1 |

product-info works!

2 | -------------------------------------------------------------------------------- /src/client/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/customer-info/customer-info.component.html: -------------------------------------------------------------------------------- 1 |

customer-info works!

2 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/models/checkOutParams.ts: -------------------------------------------------------------------------------- 1 | export class CheckOutParams { 2 | cartId: string; 3 | } 4 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/customer-carts/customer-carts.component.html: -------------------------------------------------------------------------------- 1 |

customer-carts works!

2 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/components/user/user-form/user-form.component.scss: -------------------------------------------------------------------------------- 1 | .checkbox { 2 | margin: 0 10px; 3 | } 4 | -------------------------------------------------------------------------------- /src/client/src/assets/fluentpos_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chhinsras/fluentpos/HEAD/src/client/src/assets/fluentpos_logo.png -------------------------------------------------------------------------------- /src/client/src/assets/images/bg-login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chhinsras/fluentpos/HEAD/src/client/src/assets/images/bg-login.jpg -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/models/brand.ts: -------------------------------------------------------------------------------- 1 | export interface Brand { 2 | id: string; 3 | name: string; 4 | detail: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/client/src/app/core/models/uploads/upload-type.ts: -------------------------------------------------------------------------------- 1 | export enum UploadType { 2 | Product, 3 | Brand, 4 | Category, 5 | Customer, 6 | } 7 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/models/category.ts: -------------------------------------------------------------------------------- 1 | export interface Category { 2 | id: string; 3 | name: string; 4 | detail: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/client/src/app/core/models/cart/cart.ts: -------------------------------------------------------------------------------- 1 | export class CartApiModel { 2 | id: string; 3 | customerId: string; 4 | timestamp: Date; 5 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/models/brand.ts: -------------------------------------------------------------------------------- 1 | export interface Brand { 2 | id: string; 3 | name: string; 4 | detail: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/client/src/app/core/models/Filters/PaginatedFilter.ts: -------------------------------------------------------------------------------- 1 | export interface PaginatedFilter { 2 | pageNumber: number; 3 | pageSize: number; 4 | } 5 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/models/category.ts: -------------------------------------------------------------------------------- 1 | export interface Category { 2 | id: string; 3 | name: string; 4 | detail: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/client/src/assets/images/50124-user-profile.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chhinsras/fluentpos/HEAD/src/client/src/assets/images/50124-user-profile.gif -------------------------------------------------------------------------------- /src/client/src/app/core/models/identity/refreshTokenRequest.ts: -------------------------------------------------------------------------------- 1 | export interface RefreshTokenRequest { 2 | token: string; 3 | refreshToken: string; 4 | } -------------------------------------------------------------------------------- /src/client/src/app/core/models/wrappers/IResult.ts: -------------------------------------------------------------------------------- 1 | export interface IResult 2 | { 3 | succeeded: boolean; 4 | messages: string[]; 5 | data: T | T[]; 6 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/models/role.ts: -------------------------------------------------------------------------------- 1 | export interface Role { 2 | id: string 3 | name: string 4 | description: string 5 | } 6 | -------------------------------------------------------------------------------- /src/client/src/app/core/models/identity/token.ts: -------------------------------------------------------------------------------- 1 | export class Token { 2 | token: string; 3 | refreshToken: string; 4 | refreshTokenExpiryTime: Date; 5 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/models/resetPassword.ts: -------------------------------------------------------------------------------- 1 | export class ResetPassword { 2 | email: string; 3 | password: string; 4 | token: string; 5 | } -------------------------------------------------------------------------------- /workspace/fluentpos.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "../src/client" 5 | }, 6 | { 7 | "path": "../src/server" 8 | } 9 | ] 10 | } -------------------------------------------------------------------------------- /src/client/src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .mat-row:nth-child(even){ 2 | background-color: red; 3 | } 4 | 5 | .mat-row:nth-child(odd){ 6 | background-color: black; 7 | } 8 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/components/role/role-permission-form/role-permission-form.component.scss: -------------------------------------------------------------------------------- 1 | .mat-badge-medium .mat-badge-content { 2 | width: fit-content; 3 | } 4 | -------------------------------------------------------------------------------- /src/server/API/Bootstrapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | FluentPOS.Bootstrapper 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/client/src/app/layouts/home-layout/home-layout.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 |
7 |
-------------------------------------------------------------------------------- /src/client/src/app/modules/pos/models/checkOut.ts: -------------------------------------------------------------------------------- 1 | import { CartItem } from "./cart"; 2 | 3 | export class CheckOut { 4 | cartId: string; 5 | customerId: string; 6 | cartItems: CartItem[]; 7 | } 8 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/models/customer.ts: -------------------------------------------------------------------------------- 1 | export interface Customer { 2 | id: string; 3 | name: string; 4 | phone: string; 5 | email: string; 6 | imageUrl: string; 7 | type: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/people/models/customer.ts: -------------------------------------------------------------------------------- 1 | export interface Customer { 2 | id: string; 3 | name: string; 4 | phone: string; 5 | email: string; 6 | imageUrl: string; 7 | type: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/server/API/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft": "Warning", 6 | "Microsoft.Hosting.Lifetime": "Information" 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/table/table-column.ts: -------------------------------------------------------------------------------- 1 | export interface TableColumn { 2 | name: string; 3 | dataKey: string; 4 | position?: 'right' | 'left'; 5 | isSortable?: boolean; 6 | isShowable?: boolean; 7 | } 8 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/pos-toolbar/pos-toolbar.component.scss: -------------------------------------------------------------------------------- 1 | .angular-logo { 2 | height: 26px; 3 | margin: 0 4px 3px 0; 4 | vertical-align: middle; 5 | } 6 | .nav-spacer { 7 | flex: 1 1 auto; 8 | } -------------------------------------------------------------------------------- /src/client/src/app/core/models/uploads/upload.ts: -------------------------------------------------------------------------------- 1 | import { UploadType } from "./upload-type"; 2 | 3 | export class Upload { 4 | fileName: string; 5 | extension: string; 6 | uploadType: UploadType; 7 | data: string | ArrayBuffer; 8 | } 9 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/models/identityParams.ts: -------------------------------------------------------------------------------- 1 | export class ConfirmEmailParams { 2 | userId: string; 3 | code: string; 4 | } 5 | 6 | export class ConfirmPhoneNumberParams { 7 | userId: string; 8 | code: string; 9 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/models/userRole.ts: -------------------------------------------------------------------------------- 1 | export interface UserRole 2 | { 3 | userRoles: UserRoleModel[]; 4 | } 5 | export interface UserRoleModel { 6 | roleId: string; 7 | roleName: string; 8 | selected: boolean; 9 | } 10 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/catalog/catalog.component.scss: -------------------------------------------------------------------------------- 1 | .catalog-card { 2 | margin-bottom: 30px; 3 | padding: 20px; 4 | border-radius: 4px; 5 | box-shadow: 0 10px 60px 0 rgba(29, 29, 31, .09); 6 | height: calc(100vh-10); 7 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/cart/cart.component.scss: -------------------------------------------------------------------------------- 1 | .content { 2 | margin-top: 58px 3 | } 4 | 5 | .checkout { 6 | bottom: 0px; 7 | background: whitesmoke; 8 | position: absolute; 9 | width: 100%; 10 | list-style-type: none; 11 | } 12 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/event-logs/event-logs.component.scss: -------------------------------------------------------------------------------- 1 | tr.example-detail-row { 2 | height: 0; 3 | } 4 | 5 | .example-element-detail { 6 | overflow: hidden; 7 | display: flex; 8 | } 9 | 10 | .example-element-row td { 11 | border-bottom-width: 0; 12 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/about/about.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | 5 | 6 | @NgModule({ 7 | declarations: [], 8 | imports: [ 9 | CommonModule 10 | ] 11 | }) 12 | export class AboutModule { } 13 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/sales/models/product.ts: -------------------------------------------------------------------------------- 1 | export interface Product { 2 | orderId: string; 3 | productId: string; 4 | quantity: number; 5 | category: string; 6 | brand: string; 7 | price: number; 8 | tax: number; 9 | discount: number; 10 | total: number; 11 | } 12 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/models/brandParams.ts: -------------------------------------------------------------------------------- 1 | import { PaginatedFilter } from 'src/app/core/models/Filters/PaginatedFilter'; 2 | 3 | export class BrandParams implements PaginatedFilter { 4 | searchString: string; 5 | pageNumber: number; 6 | pageSize: number; 7 | orderBy: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/models/categoryParams.ts: -------------------------------------------------------------------------------- 1 | import { PaginatedFilter } from 'src/app/core/models/Filters/PaginatedFilter'; 2 | 3 | export class CategoryParams implements PaginatedFilter { 4 | searchString: string; 5 | pageNumber: number; 6 | pageSize: number; 7 | orderBy: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/client/src/app/core/models/event-logs/event-log.ts: -------------------------------------------------------------------------------- 1 | export class EventLog { 2 | id: string; 3 | data: string; 4 | oldValues: string; 5 | newValues: string; 6 | email: string; 7 | userId: string; 8 | messageType: string; 9 | timestamp: string; 10 | eventDescription: string; 11 | } 12 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/models/brandParams.ts: -------------------------------------------------------------------------------- 1 | import { PaginatedFilter } from 'src/app/core/models/Filters/PaginatedFilter'; 2 | 3 | export class BrandParams implements PaginatedFilter { 4 | searchString: string; 5 | pageNumber: number; 6 | pageSize: number; 7 | orderBy: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/dashboard/dashboard.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | dashboard.title 4 | dashboard.subtitle 5 | 6 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/models/roleParams.ts: -------------------------------------------------------------------------------- 1 | import { PaginatedFilter } from 'src/app/core/models/Filters/PaginatedFilter'; 2 | 3 | export class RoleParams implements PaginatedFilter { 4 | searchString: string; 5 | pageNumber: number; 6 | pageSize: number; 7 | orderBy: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/models/userParams.ts: -------------------------------------------------------------------------------- 1 | import { PaginatedFilter } from 'src/app/core/models/Filters/PaginatedFilter'; 2 | 3 | export class UserParams implements PaginatedFilter { 4 | searchString: string; 5 | pageNumber: number; 6 | pageSize: number; 7 | orderBy: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/models/categoryParams.ts: -------------------------------------------------------------------------------- 1 | import { PaginatedFilter } from 'src/app/core/models/Filters/PaginatedFilter'; 2 | 3 | export class CategoryParams implements PaginatedFilter { 4 | searchString: string; 5 | pageNumber: number; 6 | pageSize: number; 7 | orderBy: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/sales/models/orderParams.ts: -------------------------------------------------------------------------------- 1 | import { PaginatedFilter } from "src/app/core/models/Filters/PaginatedFilter"; 2 | 3 | export class OrderParams implements PaginatedFilter { 4 | searchString: string; 5 | pageNumber: number; 6 | pageSize: number; 7 | orderBy: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/models/customerParams.ts: -------------------------------------------------------------------------------- 1 | import { PaginatedFilter } from "src/app/core/models/Filters/PaginatedFilter"; 2 | 3 | export class CustomerParams implements PaginatedFilter { 4 | searchString: string; 5 | pageNumber: number; 6 | pageSize: number; 7 | orderBy: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/client/src/app/core/models/wrappers/Result.ts: -------------------------------------------------------------------------------- 1 | import { IResult } from "./IResult"; 2 | 3 | export class Result implements IResult 4 | { 5 | succeeded: boolean; 6 | messages: string[]; 7 | data: T; 8 | source: string; 9 | exception: string; 10 | errorCode: number; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/event-logs/components/event-log-details/event-log-details.component.scss: -------------------------------------------------------------------------------- 1 | .jsonCode 2 | { 3 | padding: 10px; 4 | background: #dcdcdc61; 5 | border-radius: 5px; 6 | } 7 | .pre 8 | { 9 | margin: 0px!important; 10 | } 11 | .row 12 | { 13 | margin-bottom: 10px; 14 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/people/models/customerParams.ts: -------------------------------------------------------------------------------- 1 | import { PaginatedFilter } from "src/app/core/models/Filters/PaginatedFilter"; 2 | 3 | export class CustomerParams implements PaginatedFilter { 4 | searchString: string; 5 | pageNumber: number; 6 | pageSize: number; 7 | orderBy: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/event-logs/models/eventLogParams.ts: -------------------------------------------------------------------------------- 1 | import { PaginatedFilter } from "src/app/core/models/Filters/PaginatedFilter"; 2 | 3 | export class EventLogParams implements PaginatedFilter { 4 | orderBy: string; 5 | searchString: string; 6 | pageNumber: number; 7 | pageSize: number; 8 | } 9 | -------------------------------------------------------------------------------- /src/client/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | async navigateTo(): Promise { 5 | return browser.get(browser.baseUrl); 6 | } 7 | 8 | async getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/client/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Sales/Orders/PaginatedSalesFilter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using FluentPOS.Shared.DTOs.Filters; 6 | 7 | namespace FluentPOS.Shared.DTOs.Sales.Orders 8 | { 9 | public class PaginatedSalesFilter : PaginatedFilter 10 | { 11 | } 12 | } -------------------------------------------------------------------------------- /src/client/src/app/core/pipes/data-property-getter.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'dataPropertyGetter', 5 | }) 6 | export class DataPropertyGetterPipe implements PipeTransform { 7 | transform(object: any, keyName: string, ...args: unknown[]): unknown { 8 | return object[keyName]; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/models/productParams.ts: -------------------------------------------------------------------------------- 1 | import { PaginatedFilter } from 'src/app/core/models/Filters/PaginatedFilter'; 2 | 3 | export class ProductParams implements PaginatedFilter { 4 | searchString: string; 5 | brandIds: string[]; 6 | categoryIds: string[]; 7 | pageNumber: number; 8 | pageSize: number; 9 | orderBy: string; 10 | } 11 | -------------------------------------------------------------------------------- /src/client/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/models/productParams.ts: -------------------------------------------------------------------------------- 1 | import { PaginatedFilter } from 'src/app/core/models/Filters/PaginatedFilter'; 2 | 3 | export class ProductParams implements PaginatedFilter { 4 | searchString: string; 5 | brandId: number; 6 | categoryId: number; 7 | pageNumber: number; 8 | pageSize: number; 9 | orderBy: string; 10 | } 11 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/settings/settings.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { TranslateModule } from '@ngx-translate/core'; 4 | @NgModule({ 5 | declarations: [], 6 | imports: [ 7 | CommonModule, 8 | TranslateModule 9 | ] 10 | }) 11 | export class SettingsModule { } 12 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/pos.component.scss: -------------------------------------------------------------------------------- 1 | .sidenav-container { 2 | height: 100vh; 3 | } 4 | 5 | .sidenav { 6 | border: 0 solid rgba(0, 0, 0, 0.5); 7 | width: 30vw; 8 | } 9 | 10 | 11 | @media screen and (max-width:906px) { 12 | .sidenav { 13 | width: 100vw; 14 | } 15 | } 16 | 17 | .container { 18 | padding: 17px!important; 19 | } 20 | -------------------------------------------------------------------------------- /src/client/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/about/about.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-about', 5 | templateUrl: './about.component.html', 6 | styleUrls: ['./about.component.scss'] 7 | }) 8 | export class AboutComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/sales/sales.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-sales', 5 | templateUrl: './sales.component.html', 6 | styleUrls: ['./sales.component.scss'] 7 | }) 8 | export class SalesComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/people/people.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-people', 5 | templateUrl: './people.component.html', 6 | styleUrls: ['./people.component.scss'] 7 | }) 8 | export class PeopleComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/catalog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-catalog', 5 | templateUrl: './catalog.component.html', 6 | styleUrls: ['./catalog.component.scss'] 7 | }) 8 | export class CatalogComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/identity.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-identity', 5 | templateUrl: './identity.component.html', 6 | styleUrls: ['./identity.component.scss'] 7 | }) 8 | export class IdentityComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/core/services/busy.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { BehaviorSubject } from 'rxjs'; 3 | 4 | @Injectable() 5 | export class BusyService { 6 | 7 | public isLoading: BehaviorSubject = new BehaviorSubject(true); 8 | public isOverlay: BehaviorSubject = new BehaviorSubject(true); 9 | 10 | constructor() { } 11 | } 12 | -------------------------------------------------------------------------------- /src/client/src/app/layouts/pos-layout/pos-layout.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-pos-layout', 5 | templateUrl: './pos-layout.component.html', 6 | styleUrls: ['./pos-layout.component.scss'] 7 | }) 8 | export class PosLayoutComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/dashboard/dashboard.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-dashboard', 5 | templateUrl: './dashboard.component.html', 6 | styleUrls: ['./dashboard.component.scss'] 7 | }) 8 | export class DashboardComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/not-found/not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-not-found', 5 | templateUrl: './not-found.component.html', 6 | styleUrls: ['./not-found.component.scss'] 7 | }) 8 | export class NotFoundComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/layouts/auth-layout/auth-layout.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-auth-layout', 5 | templateUrl: './auth-layout.component.html', 6 | styleUrls: ['./auth-layout.component.scss'] 7 | }) 8 | export class AuthLayoutComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/layouts/home-layout/home-layout.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-home-layout', 5 | templateUrl: './home-layout.component.html', 6 | styleUrls: ['./home-layout.component.scss'] 7 | }) 8 | export class HomeLayoutComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/models/permission.ts: -------------------------------------------------------------------------------- 1 | export interface Permission { 2 | roleId: string 3 | // roleName: string 4 | // description: string 5 | roleClaims: RoleClaim[] 6 | } 7 | 8 | export interface RoleClaim { 9 | id: number 10 | roleId: string 11 | type: string 12 | value: string 13 | description: string 14 | group: string 15 | selected: boolean 16 | } 17 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/models/product.ts: -------------------------------------------------------------------------------- 1 | export interface Product { 2 | id: string; 3 | name: string; 4 | localeName: string; 5 | brandName: string; 6 | categoryName: string; 7 | price: number; 8 | cost: number; 9 | imageUrl: string; 10 | tax: number; 11 | taxMethod: string; 12 | barcodeSymbology: string; 13 | isAlert?: boolean; 14 | alertQuantity: number; 15 | detail: string; 16 | } 17 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/people/components/supplier/supplier.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-supplier', 5 | templateUrl: './supplier.component.html', 6 | styleUrls: ['./supplier.component.scss'] 7 | }) 8 | export class SupplierComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/core/models/wrappers/PaginatedResult.ts: -------------------------------------------------------------------------------- 1 | import { IResult } from "./IResult"; 2 | export class PaginatedResult implements IResult 3 | { 4 | succeeded: boolean; 5 | messages: string[]; 6 | data: T[]; 7 | source: string; 8 | exception: string; 9 | errorCode: number; 10 | currentPage: number; 11 | pageSize: number; 12 | totalPages: number; 13 | totalCount: number; 14 | } 15 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/table/custom-action.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from "@angular/core"; 2 | 3 | export class CustomAction { 4 | title: string; 5 | icon: string; 6 | color: string; 7 | constructor(title: string, icon: string = null, color: string = null) { 8 | this.title = title; 9 | this.color = color ?? 'primary'; 10 | this.icon = icon ?? 'build'; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/client/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/server-error/server-error.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-server-error', 5 | templateUrl: './server-error.component.html', 6 | styleUrls: ['./server-error.component.scss'] 7 | }) 8 | export class ServerErrorComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/product-info/product-info.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-product-info', 5 | templateUrl: './product-info.component.html', 6 | styleUrls: ['./product-info.component.scss'] 7 | }) 8 | export class ProductInfoComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.error(err)); 13 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/access-denial/access-denial.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-access-denial', 5 | templateUrl: './access-denial.component.html', 6 | styleUrls: ['./access-denial.component.scss'] 7 | }) 8 | export class AccessDenialComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/customer-info/customer-info.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-customer-info', 5 | templateUrl: './customer-info.component.html', 6 | styleUrls: ['./customer-info.component.scss'] 7 | }) 8 | export class CustomerInfoComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/customer-carts/customer-carts.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-customer-carts', 5 | templateUrl: './customer-carts.component.html', 6 | styleUrls: ['./customer-carts.component.scss'] 7 | }) 8 | export class CustomerCartsComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/pos-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { PosComponent } from './pos.component'; 4 | 5 | const routes: Routes = [ 6 | { 7 | path: '', 8 | component: PosComponent 9 | } 10 | ]; 11 | 12 | @NgModule({ 13 | imports: [RouterModule.forChild(routes)], 14 | exports: [RouterModule] 15 | }) 16 | export class PosRoutingModule { } 17 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/models/user.ts: -------------------------------------------------------------------------------- 1 | export interface User { 2 | id: string; 3 | userName: string; 4 | firstName: string; 5 | lastName: string; 6 | email: string; 7 | emailConfirmed: boolean; 8 | curentPassword: string; 9 | password: string; 10 | confirmPassword: string; 11 | isActive: boolean; 12 | phoneNumber: string; 13 | phoneNumberConfirmed: boolean; 14 | profilePictureUrl: string; 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/customer-skeleton/customer-skeleton.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-customer-skeleton', 5 | templateUrl: './customer-skeleton.component.html', 6 | styles: [ 7 | ] 8 | }) 9 | export class CustomerSkeletonComponent implements OnInit { 10 | customers = new Array(6); 11 | constructor() { } 12 | 13 | ngOnInit(): void { 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/client/src/app/core/models/cart/cart-item.ts: -------------------------------------------------------------------------------- 1 | export class CartItemApiModel { 2 | id: string; 3 | cartId: string; 4 | productId: string; 5 | quantity: number; 6 | productName: string; 7 | productDescription: string; 8 | rate: number; 9 | constructor(cartId: string, productId: string, quantity: number) { 10 | this.cartId = cartId; 11 | this.productId = productId; 12 | this.quantity = quantity; 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/cart-skeleton/cart-skeleton.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-cart-skeleton', 5 | templateUrl: './cart-skeleton.component.html', 6 | styleUrls: ['./cart-skeleton.component.scss'] 7 | }) 8 | export class CartSkeletonComponent implements OnInit { 9 | cartItems = new Array(4); 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/sales/models/order.ts: -------------------------------------------------------------------------------- 1 | import { Product } from "./product"; 2 | 3 | export interface Order { 4 | id: string; 5 | referenceNumber: string; 6 | timeStamp: Date; 7 | customerId: string; 8 | customerName: string; 9 | customerPhone: string; 10 | customerEmail: string; 11 | subTotal: number; 12 | tax: number; 13 | discount: number; 14 | total: number; 15 | isPaid: boolean; 16 | note: string; 17 | products: Product[] 18 | } 19 | -------------------------------------------------------------------------------- /src/client/src/app/modules/home/home-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { WelcomeComponent } from './welcome/welcome.component'; 4 | 5 | const routes: Routes = [ 6 | { 7 | path: '', 8 | component: WelcomeComponent 9 | } 10 | ]; 11 | 12 | @NgModule({ 13 | imports: [RouterModule.forChild(routes)], 14 | exports: [RouterModule] 15 | }) 16 | export class HomeRoutingModule { } 17 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/table/table.component.scss: -------------------------------------------------------------------------------- 1 | table { 2 | width: 100%; 3 | } 4 | 5 | .text-right { 6 | text-align: right !important; 7 | } 8 | td.mat-cell{ 9 | border-bottom-style:dotted; 10 | height: 60px!important; 11 | } 12 | 13 | th.mat-header-cell{ 14 | border-bottom-style: none; 15 | 16 | } 17 | .mat-icon { 18 | width: 17px; 19 | height: 17px; 20 | font-size: 17px; 21 | } 22 | 23 | .mat-raised-button 24 | { 25 | min-width: 0px!important; 26 | } 27 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/sales/sales-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { OrderComponent } from './components/order/order.component'; 2 | import { NgModule } from '@angular/core'; 3 | import { RouterModule, Routes } from '@angular/router'; 4 | 5 | const routes: Routes = [ 6 | { 7 | path: 'orders', 8 | component: OrderComponent 9 | } 10 | ]; 11 | 12 | @NgModule({ 13 | imports: [RouterModule.forChild(routes)], 14 | exports: [RouterModule] 15 | }) 16 | export class SalesRoutingModule { } 17 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/event-logs/event-logs.component.html: -------------------------------------------------------------------------------- 1 |
2 | 6 | 7 |
-------------------------------------------------------------------------------- /src/client/src/app/modules/admin/people/people-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { CustomerComponent } from './components/customer/customer.component'; 4 | 5 | 6 | const routes: Routes = [ 7 | { 8 | path: 'customers', 9 | component: CustomerComponent 10 | } 11 | ]; 12 | 13 | @NgModule({ 14 | imports: [RouterModule.forChild(routes)], 15 | exports: [RouterModule] 16 | }) 17 | export class PeopleRoutingModule { } 18 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/uploader/uploader.component.html: -------------------------------------------------------------------------------- 1 |
2 | 4 |
5 | 6 | 9 | -------------------------------------------------------------------------------- /src/server/Modules/Sales/Modules.Sales.Core/Features/Sales/Queries/GetOrderByIdQuery.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using FluentPOS.Shared.Core.Wrapper; 6 | using FluentPOS.Shared.DTOs.Sales.Orders; 7 | using MediatR; 8 | 9 | namespace FluentPOS.Modules.Sales.Core.Features.Sales.Queries 10 | { 11 | public class GetOrderByIdQuery : IRequest> 12 | { 13 | public Guid Id { get; set; } 14 | 15 | } 16 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Sales/Orders/GetSalesResponse.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace FluentPOS.Shared.DTOs.Sales.Orders 7 | { 8 | public record GetSalesResponse(Guid Id, string ReferenceNumber, DateTime TimeStamp, Guid CustomerId, string CustomerName, string CustomerPhone, 9 | string CustomerEmail, decimal SubTotal, decimal Tax, decimal Discount, decimal Total, bool IsPaid, string Note); 10 | } -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/logout-dialog/logout-dialog.component.html: -------------------------------------------------------------------------------- 1 |

dialogs.logout.title

2 | dialogs.logout.message 3 | 4 | 5 | 7 | -------------------------------------------------------------------------------- /src/client/src/app/modules/auth/auth-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | import { LoginComponent } from './login/login.component'; 4 | 5 | const routes: Routes = [ 6 | { 7 | path: '', component: LoginComponent 8 | }, 9 | { 10 | path: 'login', component: LoginComponent 11 | }, 12 | ]; 13 | 14 | @NgModule({ 15 | imports: [RouterModule.forChild(routes)], 16 | exports: [RouterModule] 17 | }) 18 | export class AuthRoutingModule { } 19 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/catalog-skeleton/catalog-skeleton.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-catalog-skeleton', 5 | templateUrl: './catalog-skeleton.component.html', 6 | styleUrls: ['./catalog-skeleton.component.scss'] 7 | }) 8 | export class CatalogSkeletonComponent implements OnInit { 9 | @Input() showImage : Boolean; 10 | products = new Array(16); 11 | 12 | constructor() { } 13 | 14 | ngOnInit(): void { 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Sales/Orders/ProductResponse.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace FluentPOS.Shared.DTOs.Sales.Orders 7 | { 8 | public record ProductResponse 9 | ( 10 | Guid OrderId, 11 | Guid ProductId, 12 | int Quantity, 13 | string Category, 14 | string Brand, 15 | decimal Price, 16 | decimal Tax, 17 | decimal Discount, 18 | decimal Total 19 | ); 20 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/event-logs/event-logs.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { EventLogDetailsComponent } from './components/event-log-details/event-log-details.component'; 4 | import { MaterialModule } from 'src/app/core/material/material.module'; 5 | 6 | @NgModule({ 7 | declarations: [ 8 | EventLogDetailsComponent 9 | ], 10 | imports: [ 11 | CommonModule, 12 | MaterialModule 13 | ] 14 | }) 15 | export class ActivityLogsModule { } 16 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/delete-dialog/delete-dialog.component.html: -------------------------------------------------------------------------------- 1 |

{{'dialogs.delete.title'|translate}}

2 | 3 | {{message}} 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/client/src/app/layouts/home-layout/home-layout.component.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | padding-right: 15px; 3 | padding-left: 15px; 4 | margin-right: auto; 5 | margin-left: auto; 6 | } 7 | @media (min-width: 576px) { 8 | .container { 9 | width: 540px; 10 | } 11 | } 12 | @media (min-width: 768px) { 13 | .container { 14 | width: 720px; 15 | } 16 | } 17 | @media (min-width: 992px) { 18 | .container { 19 | width: 960px; 20 | } 21 | } 22 | @media (min-width: 1200px) { 23 | .container { 24 | width: 1140px; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/shared/components/delete-dialog/delete-dialog.component.html: -------------------------------------------------------------------------------- 1 |

{{'dialogs.delete.title'|translate}}

2 | 3 | {{message}} 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/models/cart.ts: -------------------------------------------------------------------------------- 1 | export class CartItem { 2 | id: string; 3 | productId: string; 4 | quantity: number; 5 | displayName: string; 6 | category: string; 7 | rate: number; 8 | total: number; 9 | constructor(productId: string, quantity: number, displayName: string, category: string, rate: number) { 10 | this.productId = productId; 11 | this.quantity = quantity; 12 | this.displayName = displayName; 13 | this.category = category; 14 | this.rate = rate; 15 | } 16 | } -------------------------------------------------------------------------------- /src/client/src/app/core/services/local-storage.service.ts: -------------------------------------------------------------------------------- 1 | import {Injectable} from '@angular/core'; 2 | 3 | @Injectable() 4 | export class LocalStorageService { 5 | 6 | constructor() { 7 | } 8 | 9 | public setItem(key: string, value: string) { 10 | localStorage.setItem(key, value); 11 | } 12 | 13 | public getItem(key: string) { 14 | return localStorage.getItem(key); 15 | } 16 | 17 | public removeItem(key: string) { 18 | localStorage.removeItem(key); 19 | } 20 | 21 | public clear() { 22 | localStorage.clear(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/client/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "type": "chrome", 6 | "request": "launch", 7 | "name": "Launch Chrome against localhost", 8 | "url": "http://localhost:4200", 9 | "webRoot": "${workspaceFolder}" 10 | }, 11 | { 12 | "type": "chrome", 13 | "request": "attach", 14 | "name": "Attach to Chrome", 15 | "port": 9222, 16 | "webRoot": "${workspaceFolder}" 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/models/product.ts: -------------------------------------------------------------------------------- 1 | import { Upload } from "src/app/core/models/uploads/upload"; 2 | 3 | export interface Product { 4 | id: string; 5 | name: string; 6 | localeName: string; 7 | brandId: string; 8 | brandName: string; 9 | categoryId: string; 10 | categoryName: string; 11 | price: number; 12 | cost: number; 13 | imageUrl: string; 14 | tax: number; 15 | taxMethod: string; 16 | barcodeSymbology: string; 17 | isAlert?: boolean; 18 | alertQuantity: number; 19 | detail: string; 20 | uploadRequest?: Upload; 21 | } 22 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/pos.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
10 | 11 |
12 |
13 |
14 | -------------------------------------------------------------------------------- /src/client/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | fluentpos 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/components/brand/brand.component.html: -------------------------------------------------------------------------------- 1 |
2 | 7 | 8 |
-------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/components/product/product.component.html: -------------------------------------------------------------------------------- 1 |
2 | 7 | 8 |
-------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/not-found/not-found.component.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | padding-right: 15px; 3 | padding-left: 15px; 4 | margin-right: auto; 5 | margin-left: auto; 6 | } 7 | @media (min-width: 576px) { 8 | .container { 9 | width: 540px; 10 | } 11 | } 12 | @media (min-width: 768px) { 13 | .container { 14 | width: 720px; 15 | } 16 | } 17 | @media (min-width: 992px) { 18 | .container { 19 | width: 960px; 20 | } 21 | } 22 | @media (min-width: 1200px) { 23 | .container { 24 | width: 1140px; 25 | } 26 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/people/components/customer/customer.component.html: -------------------------------------------------------------------------------- 1 |
2 | 7 | 8 |
-------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/access-denial/access-denial.component.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | padding-right: 15px; 3 | padding-left: 15px; 4 | margin-right: auto; 5 | margin-left: auto; 6 | } 7 | @media (min-width: 576px) { 8 | .container { 9 | width: 540px; 10 | } 11 | } 12 | @media (min-width: 768px) { 13 | .container { 14 | width: 720px; 15 | } 16 | } 17 | @media (min-width: 992px) { 18 | .container { 19 | width: 960px; 20 | } 21 | } 22 | @media (min-width: 1200px) { 23 | .container { 24 | width: 1140px; 25 | } 26 | } -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/server-error/server-error.component.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | padding-right: 15px; 3 | padding-left: 15px; 4 | margin-right: auto; 5 | margin-left: auto; 6 | } 7 | @media (min-width: 576px) { 8 | .container { 9 | width: 540px; 10 | } 11 | } 12 | @media (min-width: 768px) { 13 | .container { 14 | width: 720px; 15 | } 16 | } 17 | @media (min-width: 992px) { 18 | .container { 19 | width: 960px; 20 | } 21 | } 22 | @media (min-width: 1200px) { 23 | .container { 24 | width: 1140px; 25 | } 26 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/catalog/components/category/category.component.html: -------------------------------------------------------------------------------- 1 |
2 | 7 | 8 |
-------------------------------------------------------------------------------- /src/client/src/app/core/api/checkout/checkout-api.service.ts: -------------------------------------------------------------------------------- 1 | import { HttpClient } from '@angular/common/http'; 2 | import { Injectable } from '@angular/core'; 3 | import { environment } from 'src/environments/environment'; 4 | import { Result } from '../../models/wrappers/Result'; 5 | 6 | @Injectable({ 7 | providedIn: 'root' 8 | }) 9 | export class CheckoutApiService { 10 | 11 | baseUrl = environment.apiUrl + 'sales/orders/'; 12 | 13 | constructor(private http: HttpClient) { 14 | } 15 | submitOrder(cartId: string) { 16 | return this.http.post>(this.baseUrl, { "cartId": cartId }); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/pos.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { BusyService } from 'src/app/core/services/busy.service'; 3 | import { ThemeService } from 'src/app/core/services/theme.service'; 4 | 5 | @Component({ 6 | selector: 'app-pos', 7 | templateUrl: './pos.component.html', 8 | styleUrls: ['./pos.component.scss'] 9 | }) 10 | export class PosComponent implements OnInit { 11 | 12 | constructor(private themeService: ThemeService,public busyService: BusyService) { } 13 | 14 | ngOnInit(): void { 15 | } 16 | toggleDarkMode() { 17 | this.themeService.toggleDarkMode(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/client/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "compileOnSave": false, 4 | "compilerOptions": { 5 | "baseUrl": "./", 6 | "outDir": "./dist/out-tsc", 7 | "sourceMap": true, 8 | "declaration": false, 9 | "downlevelIteration": true, 10 | "experimentalDecorators": true, 11 | "moduleResolution": "node", 12 | "importHelpers": true, 13 | "target": "es2015", 14 | "module": "es2020", 15 | "lib": [ 16 | "es2018", 17 | "dom" 18 | ] 19 | }, 20 | "angularCompilerOptions": { 21 | "enableI18nLegacyMessageIdFormat": false 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/client/src/app/modules/auth/auth.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { AuthRoutingModule } from './auth-routing.module'; 5 | import { LoginComponent } from './login/login.component'; 6 | import { MaterialModule } from 'src/app/core/material/material.module'; 7 | import { SharedModule } from 'src/app/core/shared/shared.module'; 8 | 9 | 10 | @NgModule({ 11 | declarations: [ 12 | LoginComponent 13 | ], 14 | imports: [ 15 | CommonModule, 16 | AuthRoutingModule, 17 | MaterialModule, 18 | SharedModule 19 | ] 20 | }) 21 | export class AuthModule { } 22 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: fluentpos 4 | patreon: # Replace with a single Patreon username 5 | open_collective: fluentpos 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/components/role/role.component.html: -------------------------------------------------------------------------------- 1 |
2 | 7 | 8 |
-------------------------------------------------------------------------------- /src/client/src/app/modules/home/home.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { HomeRoutingModule } from './home-routing.module'; 5 | import { MaterialModule } from 'src/app/core/material/material.module'; 6 | import { WelcomeComponent } from './welcome/welcome.component'; 7 | import { SharedModule } from 'src/app/core/shared/shared.module'; 8 | 9 | 10 | @NgModule({ 11 | declarations: [ 12 | WelcomeComponent 13 | ], 14 | imports: [ 15 | CommonModule, 16 | HomeRoutingModule, 17 | MaterialModule, 18 | SharedModule 19 | ] 20 | }) 21 | export class HomeModule { } 22 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/components/user/user.component.html: -------------------------------------------------------------------------------- 1 |
2 | 10 | 11 |
12 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Filters/BaseFilter.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.DTOs.Filters 10 | { 11 | public class BaseFilter 12 | { 13 | } 14 | } -------------------------------------------------------------------------------- /src/client/src/app/core/api/sales/sales-api.service.ts: -------------------------------------------------------------------------------- 1 | import { HttpClient, HttpParams } from '@angular/common/http'; 2 | import { Injectable } from '@angular/core'; 3 | import { environment } from 'src/environments/environment'; 4 | import { Result } from '../../models/wrappers/Result'; 5 | 6 | @Injectable({ 7 | providedIn: 'root' 8 | }) 9 | export class SalesApiService { 10 | 11 | baseUrl = environment.apiUrl + 'sales/orders/'; 12 | 13 | constructor(private http: HttpClient) { 14 | } 15 | 16 | getAlls(params: HttpParams) { 17 | return this.http.get(this.baseUrl, {params: params}); 18 | } 19 | 20 | getById(id: string) { 21 | return this.http.get(this.baseUrl + id); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/delete-dialog/delete-dialog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject, OnInit } from '@angular/core'; 2 | import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; 3 | 4 | @Component({ 5 | selector: 'app-delete-dialog', 6 | templateUrl: './delete-dialog.component.html', 7 | styleUrls: ['./delete-dialog.component.scss'] 8 | }) 9 | export class DeleteDialogComponent implements OnInit { 10 | 11 | constructor( 12 | public dialogRef: MatDialogRef, 13 | @Inject(MAT_DIALOG_DATA) public message: string 14 | ) { } 15 | 16 | ngOnInit(): void { 17 | } 18 | onNoClick(): void { 19 | this.dialogRef.close(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/logout-dialog/logout-dialog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject, OnInit } from '@angular/core'; 2 | import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; 3 | 4 | @Component({ 5 | selector: 'app-logout-dialog', 6 | templateUrl: './logout-dialog.component.html', 7 | styleUrls: ['./logout-dialog.component.scss'] 8 | }) 9 | export class LogoutDialogComponent implements OnInit { 10 | 11 | constructor( 12 | public dialogRef: MatDialogRef, 13 | @Inject(MAT_DIALOG_DATA) public message: string 14 | ) { } 15 | 16 | ngOnInit(): void { 17 | } 18 | onNoClick(): void { 19 | this.dialogRef.close(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/settings/settings.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { MultilingualService } from 'src/app/core/services/multilingual.service'; 3 | 4 | @Component({ 5 | selector: 'app-settings', 6 | templateUrl: './settings.component.html', 7 | styleUrls: ['./settings.component.scss'] 8 | }) 9 | export class SettingsComponent implements OnInit { 10 | constructor(private translationService : MultilingualService) { 11 | 12 | } 13 | selected = 'en'; 14 | ngOnInit(): void { 15 | this.selected = this.translationService.currentLanguage(); 16 | } 17 | changeLanguage() 18 | { 19 | this.translationService.changeLanguage(this.selected); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/shared/components/delete-dialog/delete-dialog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject, OnInit } from '@angular/core'; 2 | import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; 3 | 4 | @Component({ 5 | selector: 'app-delete-dialog', 6 | templateUrl: './delete-dialog.component.html', 7 | styleUrls: ['./delete-dialog.component.scss'] 8 | }) 9 | export class DeleteDialogComponent implements OnInit { 10 | 11 | constructor( 12 | public dialogRef: MatDialogRef, 13 | @Inject(MAT_DIALOG_DATA) public message: string 14 | ) { } 15 | 16 | ngOnInit(): void { 17 | } 18 | onNoClick(): void { 19 | this.dialogRef.close(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/server/Modules/Sales/Modules.Sales.Core/Entities/LedgerRecord.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Modules.Sales.Core.Entities 10 | { 11 | public class LedgerRecord 12 | { 13 | } 14 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/Tokens/TokenRequest.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.DTOs.Identity.Tokens 10 | { 11 | public record TokenRequest(string Email, string Password); 12 | } -------------------------------------------------------------------------------- /src/client/src/app/core/api/event-logs/event-log-api.service.ts: -------------------------------------------------------------------------------- 1 | import { HttpClient, HttpParams } from '@angular/common/http'; 2 | import { Injectable } from '@angular/core'; 3 | import { environment } from 'src/environments/environment'; 4 | import { EventLog } from '../../models/event-logs/event-log'; 5 | import { PaginatedResult } from '../../models/wrappers/PaginatedResult'; 6 | 7 | @Injectable({ 8 | providedIn: 'root' 9 | }) 10 | export class EventLogApiService { 11 | 12 | baseUrl = environment.apiUrl + 'identity/eventlogs'; 13 | 14 | constructor(private http: HttpClient) { 15 | } 16 | 17 | getAlls(params: HttpParams) { 18 | return this.http.get>(this.baseUrl, {params: params}); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Interfaces/IModuleDbContext.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.Core.Interfaces 10 | { 11 | public interface IModuleDbContext : IDbContext 12 | { 13 | } 14 | } -------------------------------------------------------------------------------- /.github/workflows/angular.yml: -------------------------------------------------------------------------------- 1 | name: Angular CI 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | 10 | workflow_dispatch: 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: 🛒 Checkout repository 18 | uses: actions/checkout@v2 19 | 20 | - name: ⚙️ Setup Node 21 | uses: actions/setup-node@v2 22 | with: 23 | node-version: '14' 24 | 25 | - name: 🔁 Install Dependencies 26 | run: npm install 27 | working-directory: ./src/client/ 28 | 29 | - name: 🛠️ Build Application 30 | run: npm run build 31 | working-directory: ./src/client/ 32 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/not-found/not-found.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |

404

9 |

components.notFound.header

10 |

components.notFound.text

11 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |
-------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Settings/CorsSettings.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.Core.Settings 10 | { 11 | public class CorsSettings 12 | { 13 | public string Url { get; set; } 14 | } 15 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/Tokens/RefreshTokenRequest.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.DTOs.Identity.Tokens 10 | { 11 | public record RefreshTokenRequest(string Token, string RefreshToken); 12 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Settings/CacheSettings.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.Core.Settings 10 | { 11 | public class CacheSettings 12 | { 13 | public int SlidingExpiration { get; set; } 14 | } 15 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Interfaces/Services/IDatabaseSeeder.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.Core.Interfaces.Services 10 | { 11 | public interface IDatabaseSeeder 12 | { 13 | void Initialize(); 14 | } 15 | } -------------------------------------------------------------------------------- /src/client/e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { browser, logging } from 'protractor'; 2 | import { AppPage } from './app.po'; 3 | 4 | describe('workspace-project App', () => { 5 | let page: AppPage; 6 | 7 | beforeEach(() => { 8 | page = new AppPage(); 9 | }); 10 | 11 | it('should display welcome message', async () => { 12 | await page.navigateTo(); 13 | expect(await page.getTitleText()).toEqual('client app is running!'); 14 | }); 15 | 16 | afterEach(async () => { 17 | // Assert that there are no errors emitted from the browser 18 | const logs = await browser.manage().logs().get(logging.Type.BROWSER); 19 | expect(logs).not.toContain(jasmine.objectContaining({ 20 | level: logging.Level.SEVERE, 21 | } as logging.Entry)); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Settings/ApplicationSettings.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.Core.Settings 10 | { 11 | public class ApplicationSettings 12 | { 13 | public string ApiUrl { get; set; } 14 | } 15 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Catalogs/Brands/GetBrandsResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.Catalogs.Brands 12 | { 13 | public record GetBrandsResponse(Guid Id, string Name, string Detail); 14 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/People/Carts/GetCartsResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.People.Carts 12 | { 13 | public record GetCartsResponse(Guid Id, Guid CustomerId, DateTime Timestamp); 14 | } -------------------------------------------------------------------------------- /src/client/.browserslistrc: -------------------------------------------------------------------------------- 1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | 5 | # For the full list of supported browsers by the Angular framework, please see: 6 | # https://angular.io/guide/browser-support 7 | 8 | # You can see what browsers were selected by your queries by running: 9 | # npx browserslist 10 | 11 | last 1 Chrome version 12 | last 1 Firefox version 13 | last 2 Edge major versions 14 | last 2 Safari major versions 15 | last 2 iOS major versions 16 | Firefox ESR 17 | not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. 18 | -------------------------------------------------------------------------------- /src/server/Modules/Inventory/Modules.Inventory.Core/Enums/TransactionType.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Modules.Inventory.Core.Enums 10 | { 11 | public enum TransactionType 12 | { 13 | Sale, 14 | 15 | Purchase 16 | } 17 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Catalogs/Brands/GetBrandByIdResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.Catalogs.Brands 12 | { 13 | public record GetBrandByIdResponse(Guid Id, string Name, string Detail); 14 | } -------------------------------------------------------------------------------- /src/client/src/app/core/guards/auth.guard.ts: -------------------------------------------------------------------------------- 1 | import {Injectable} from '@angular/core'; 2 | import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree} from '@angular/router'; 3 | import {Observable} from 'rxjs'; 4 | import {AuthService} from '../services/auth.service'; 5 | 6 | @Injectable() 7 | export class AuthGuard implements CanActivate { 8 | constructor(private authService: AuthService, private router: Router) { 9 | } 10 | 11 | canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { 12 | if (this.authService.isAuthenticated) { 13 | return true; 14 | } else { 15 | this.router.navigate(['login']); 16 | return false; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/server-error/server-error.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |

500

9 |

components.serverError.header

10 |

components.serverError.text

11 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |
-------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Sms/SmsRequest.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.DTOs.Sms 10 | { 11 | public class SmsRequest 12 | { 13 | public string Number { get; set; } 14 | 15 | public string Message { get; set; } 16 | } 17 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Catalogs/Categories/GetCategoriesResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.Catalogs.Categories 12 | { 13 | public record GetCategoriesResponse(Guid Id, string Name, string Detail); 14 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/Tokens/TokenResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.Identity.Tokens 12 | { 13 | public record TokenResponse(string Token, string RefreshToken, DateTime RefreshTokenExpiryTime); 14 | } -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/access-denial/access-denial.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |

403

9 |

components.accessDenial.header

10 |

components.accessDenial.text

11 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |
-------------------------------------------------------------------------------- /src/server/Modules/Sales/Modules.Sales.Core/Enums/PaymentType.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Modules.Sales.Core.Enums 10 | { 11 | public enum PaymentType : byte 12 | { 13 | Cash, 14 | 15 | CreditCard, 16 | 17 | GiftCard 18 | } 19 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Constants/ApplicationClaimType.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.Core.Constants 10 | { 11 | public static class ApplicationClaimTypes 12 | { 13 | public const string Permission = "Permission"; 14 | } 15 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Catalogs/Categories/GetCategoryByIdResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.Catalogs.Categories 12 | { 13 | public record GetCategoryByIdResponse(Guid Id, string Name, string Detail); 14 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/components/profile/profile.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-profile', 5 | templateUrl: './profile.component.html', 6 | styleUrls: ['./profile.component.scss'] 7 | }) 8 | export class ProfileComponent implements OnInit { 9 | 10 | constructor() { } 11 | url: any = []; 12 | ngOnInit(): void { 13 | } 14 | onSelectFile(event) { 15 | if (event.target.files && event.target.files[0]) { 16 | var reader = new FileReader(); 17 | 18 | reader.readAsDataURL(event.target.files[0]); // read file as data url 19 | 20 | reader.onloadend = (event) => { // called once readAsDataURL is completed 21 | this.url = event.target.result; 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/client/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false, 7 | apiUrl: "https://localhost:5001/api/v1/" 8 | }; 9 | 10 | /* 11 | * For easier debugging in development mode, you can import the following file 12 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 13 | * 14 | * This import should be commented out in production mode because it will have a negative impact 15 | * on performance if an error is thrown. 16 | */ 17 | // import 'zone.js/plugins/zone-error'; // Included with Angular CLI. 18 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/People/CartItems/GetCartItemByIdResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.People.CartItems 12 | { 13 | public record GetCartItemByIdResponse(Guid Id, Guid CartId, Guid ProductId, int Quantity); 14 | } -------------------------------------------------------------------------------- /src/server/Modules/Identity/Modules.Identity.Core/Constants/UserConstants.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Modules.Identity.Core.Constants 10 | { 11 | public static class UserConstants 12 | { 13 | public const string DefaultPassword = "123Pa$$word!"; 14 | } 15 | } -------------------------------------------------------------------------------- /src/client/src/app/core/directives/has-role.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, Input, OnInit, TemplateRef, ViewContainerRef } from '@angular/core'; 2 | import { AuthService } from '../services/auth.service'; 3 | 4 | @Directive({ 5 | selector: '[appHasRole]' 6 | }) 7 | export class HasRoleDirective implements OnInit{ 8 | @Input() appHasRole: string[]; 9 | 10 | constructor(private viewContainerRef: ViewContainerRef, 11 | private templateRef: TemplateRef, 12 | private authService: AuthService) {} 13 | 14 | ngOnInit(): void { 15 | const isAuthorized = this.authService.isAuthorized('Role', this.appHasRole); 16 | if (!isAuthorized) { 17 | this.viewContainerRef.clear(); 18 | } else { 19 | this.viewContainerRef.createEmbeddedView(this.templateRef); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Contracts/IEntity.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.Core.Contracts 10 | { 11 | public interface IEntity : IEntity 12 | { 13 | public TEntityId Id { get; set; } 14 | } 15 | 16 | public interface IEntity 17 | { 18 | } 19 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Attributes/SwaggerExcludeAttribute.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.Core.Attributes 12 | { 13 | [AttributeUsage(AttributeTargets.Property)] 14 | public class SwaggerExcludeAttribute : Attribute 15 | { 16 | } 17 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/People/Customers/GetCustomersResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.People.Customers 12 | { 13 | public record GetCustomersResponse(Guid Id, string Name, string Phone, string Email, string ImageUrl, string Type); 14 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Sales/Orders/GetOrderByIdResponse.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace FluentPOS.Shared.DTOs.Sales.Orders 7 | { 8 | public record GetOrderByIdResponse 9 | ( 10 | Guid Id, 11 | string ReferenceNumber, 12 | DateTime TimeStamp, 13 | Guid CustomerId, 14 | string CustomerName, 15 | string CustomerPhone, 16 | string CustomerEmail, 17 | decimal SubTotal, 18 | decimal Tax, 19 | decimal Discount, 20 | decimal Total, 21 | bool IsPaid, 22 | string Note, 23 | ICollection Products 24 | ); 25 | 26 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/services/checkout.service.ts: -------------------------------------------------------------------------------- 1 | import { HttpParams } from '@angular/common/http'; 2 | import { Injectable } from '@angular/core'; 3 | import { Observable } from 'rxjs'; 4 | import { map } from 'rxjs/operators'; 5 | import { CheckoutApiService } from 'src/app/core/api/checkout/checkout-api.service'; 6 | import { Result } from 'src/app/core/models/wrappers/Result'; 7 | import { CheckOutParams } from '../models/checkOutParams'; 8 | 9 | @Injectable({ 10 | providedIn: 'root' 11 | }) 12 | export class CheckoutService { 13 | 14 | constructor(public checkOutApi: CheckoutApiService) { } 15 | submitOrder(cartId:string): Observable> { 16 | return this.checkOutApi.submitOrder(cartId) 17 | .pipe(map((response: Result) => { 18 | return response; 19 | })); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Constants/CustomerTypes.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Modules.People.Core.Constants 10 | { 11 | public static class CustomerTypes 12 | { 13 | public const string General = "General"; 14 | public const string VIP = "VIP"; 15 | } 16 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/People/Customers/GetCustomerByIdResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.People.Customers 12 | { 13 | public record GetCustomerByIdResponse(Guid Id, string Name, string Phone, string Email, string ImageUrl, string Type); 14 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Interfaces/Serialization/IJsonSerializerSettingsOptions.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.Core.Interfaces.Serialization 10 | { 11 | public interface IJsonSerializerSettingsOptions : IJsonSerializerOptions, IJsonSerializerSettings 12 | { 13 | } 14 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/Users/UserRolesRequest.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Collections.Generic; 10 | 11 | namespace FluentPOS.Shared.DTOs.Identity.Users 12 | { 13 | public class UserRolesRequest 14 | { 15 | public List UserRoles { get; set; } = new(); 16 | } 17 | } -------------------------------------------------------------------------------- /src/client/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | # Only exists if Bazel was run 8 | /bazel-out 9 | 10 | # dependencies 11 | /node_modules 12 | 13 | # profiling files 14 | chrome-profiler-events*.json 15 | speed-measure-plugin*.json 16 | 17 | # IDEs and editors 18 | /.idea 19 | .project 20 | .classpath 21 | .c9/ 22 | *.launch 23 | .settings/ 24 | *.sublime-workspace 25 | 26 | # IDE - VSCode 27 | .vscode/* 28 | !.vscode/settings.json 29 | !.vscode/tasks.json 30 | !.vscode/launch.json 31 | !.vscode/extensions.json 32 | .history/* 33 | 34 | # misc 35 | /.sass-cache 36 | /connect.lock 37 | /coverage 38 | /libpeerconnection.log 39 | npm-debug.log 40 | yarn-error.log 41 | testem.log 42 | /typings 43 | 44 | # System Files 45 | .DS_Store 46 | Thumbs.db 47 | -------------------------------------------------------------------------------- /src/client/src/app/core/shared/components/logout-dialog/logout-dialog.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { LogoutDialogComponent } from './logout-dialog.component'; 4 | 5 | describe('LogoutDialogComponent', () => { 6 | let component: LogoutDialogComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ LogoutDialogComponent ] 12 | }) 13 | .compileComponents(); 14 | }); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(LogoutDialogComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Settings/SerializationSettings.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.Core.Settings 10 | { 11 | public class SerializationSettings 12 | { 13 | public bool UseSystemTextJson { get; set; } 14 | 15 | public bool UseNewtonsoftJson { get; set; } 16 | } 17 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Interfaces/Services/ISmsService.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Threading.Tasks; 10 | using FluentPOS.Shared.DTOs.Sms; 11 | 12 | namespace FluentPOS.Shared.Core.Interfaces.Services 13 | { 14 | public interface ISmsService 15 | { 16 | Task SendAsync(SmsRequest request); 17 | } 18 | } -------------------------------------------------------------------------------- /src/client/src/app/core/directives/has-permission.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, Input, OnInit, TemplateRef, ViewContainerRef } from '@angular/core'; 2 | import { AuthService } from '../services/auth.service'; 3 | 4 | @Directive({ 5 | selector: '[appHasPermission]' 6 | }) 7 | export class HasPermissionDirective implements OnInit{ 8 | @Input() appHasPermission: string[]; 9 | 10 | constructor(private viewContainerRef: ViewContainerRef, 11 | private templateRef: TemplateRef, 12 | private authService: AuthService) {} 13 | 14 | ngOnInit(): void { 15 | const isAuthorized = this.authService.isAuthorized('Permission', this.appHasPermission); 16 | if (!isAuthorized) { 17 | this.viewContainerRef.clear(); 18 | } else { 19 | this.viewContainerRef.createEmbeddedView(this.templateRef); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/shared/components/delete-dialog/delete-dialog.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { DeleteDialogComponent } from './delete-dialog.component'; 4 | 5 | describe('DeleteDialogComponent', () => { 6 | let component: DeleteDialogComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ DeleteDialogComponent ] 12 | }) 13 | .compileComponents(); 14 | }); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(DeleteDialogComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/client/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: { 11 | context(path: string, deep?: boolean, filter?: RegExp): { 12 | keys(): string[]; 13 | (id: string): T; 14 | }; 15 | }; 16 | 17 | // First, initialize the Angular testing environment. 18 | getTestBed().initTestEnvironment( 19 | BrowserDynamicTestingModule, 20 | platformBrowserDynamicTesting() 21 | ); 22 | // Then we find all the tests. 23 | const context = require.context('./', true, /\.spec\.ts$/); 24 | // And load the modules. 25 | context.keys().map(context); 26 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Interfaces/Services/IMailService.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Threading.Tasks; 10 | using FluentPOS.Shared.DTOs.Mails; 11 | 12 | namespace FluentPOS.Shared.Core.Interfaces.Services 13 | { 14 | public interface IMailService 15 | { 16 | Task SendAsync(MailRequest request); 17 | } 18 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Catalogs/Brands/PaginatedBrandFilter.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using FluentPOS.Shared.DTOs.Filters; 10 | 11 | namespace FluentPOS.Shared.DTOs.Catalogs.Brands 12 | { 13 | public class PaginatedBrandFilter : PaginatedFilter 14 | { 15 | public string SearchString { get; set; } 16 | } 17 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/identity/components/user/user-role-form/user-role-form.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | Loading ... 6 |
7 |
8 | 9 | 11 | 12 | 13 | 14 | 15 | 19 | 20 |
21 | 22 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Domain/DomainEvent.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.Core.Domain 12 | { 13 | public abstract class DomainEvent : Event 14 | { 15 | protected DomainEvent(Guid aggregateId) 16 | { 17 | AggregateId = aggregateId; 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Queries/ICacheable.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.Core.Queries 12 | { 13 | public interface ICacheable 14 | { 15 | bool BypassCache { get; } 16 | 17 | string CacheKey { get; } 18 | 19 | TimeSpan? SlidingExpiration { get; } 20 | } 21 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/Roles/RoleRequest.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.DTOs.Identity.Roles 10 | { 11 | public class RoleRequest 12 | { 13 | public string Id { get; set; } 14 | 15 | public string Name { get; set; } 16 | 17 | public string Description { get; set; } 18 | } 19 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/Roles/RoleResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.DTOs.Identity.Roles 10 | { 11 | public class RoleResponse 12 | { 13 | public string Id { get; set; } 14 | 15 | public string Name { get; set; } 16 | 17 | public string Description { get; set; } 18 | } 19 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/sales/sales.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { SalesComponent } from './sales.component'; 4 | import { SalesRoutingModule } from './sales-routing.module'; 5 | import { MaterialModule } from 'src/app/core/material/material.module'; 6 | import { SharedModule } from 'src/app/core/shared/shared.module'; 7 | import { OrderComponent } from './components/order/order.component'; 8 | import { OrderDetailComponent } from './components/order/order-detail/order-detail.component'; 9 | 10 | @NgModule({ 11 | declarations: [ 12 | SalesComponent, 13 | OrderComponent, 14 | OrderDetailComponent 15 | ], 16 | imports: [ 17 | CommonModule, 18 | SalesRoutingModule, 19 | MaterialModule, 20 | SharedModule 21 | ] 22 | }) 23 | export class SalesModule { } 24 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/People/Customers/PaginatedCustomerFilter.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using FluentPOS.Shared.DTOs.Filters; 10 | 11 | namespace FluentPOS.Shared.DTOs.People.Customers 12 | { 13 | public class PaginatedCustomerFilter : PaginatedFilter 14 | { 15 | public string SearchString { get; set; } 16 | } 17 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Interfaces/Services/IUploadService.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Threading.Tasks; 10 | using FluentPOS.Shared.DTOs.Upload; 11 | 12 | namespace FluentPOS.Shared.Core.Interfaces.Services 13 | { 14 | public interface IUploadService 15 | { 16 | Task UploadAsync(UploadRequest request); 17 | } 18 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Catalogs/Categories/PaginatedCategoryFilter.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using FluentPOS.Shared.DTOs.Filters; 10 | 11 | namespace FluentPOS.Shared.DTOs.Catalogs.Categories 12 | { 13 | public class PaginatedCategoryFilter : PaginatedFilter 14 | { 15 | public string SearchString { get; set; } 16 | } 17 | } -------------------------------------------------------------------------------- /src/client/src/app/core/services/multilingual.service.ts: -------------------------------------------------------------------------------- 1 | import {Injectable} from '@angular/core'; 2 | import {TranslateService} from '@ngx-translate/core'; 3 | import {LocalStorageService} from './local-storage.service'; 4 | 5 | @Injectable() 6 | export class MultilingualService { 7 | 8 | constructor(private translateService: TranslateService, private localStorage: LocalStorageService) { 9 | this.translateService.use('en'); 10 | } 11 | 12 | changeLanguage(languageCode: string) { 13 | this.localStorage.setItem('locale', languageCode); 14 | this.translateService.use(languageCode); 15 | } 16 | 17 | currentLanguage() { 18 | return this.localStorage.getItem('locale') ?? 'en'; 19 | } 20 | 21 | loadDefaultLanguage() { 22 | let defaultLanguage = this.localStorage.getItem('locale') ?? 'en'; 23 | this.translateService.use(defaultLanguage); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/client/src/app/modules/pos/components/customer-skeleton/customer-skeleton.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CustomerSkeletonComponent } from './customer-skeleton.component'; 4 | 5 | describe('CustomerSkeletonComponent', () => { 6 | let component: CustomerSkeletonComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ CustomerSkeletonComponent ] 12 | }) 13 | .compileComponents(); 14 | }); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(CustomerSkeletonComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/server/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "build", 8 | "command": "dotnet", 9 | "type": "shell", 10 | "args": [ 11 | "build", 12 | // Ask dotnet build to generate full paths for file names. 13 | "/property:GenerateFullPaths=true", 14 | // Do not generate summary otherwise it leads to duplicate errors in Problems panel 15 | "/consoleloggerparameters:NoSummary" 16 | ], 17 | "group": "build", 18 | "presentation": { 19 | "reveal": "silent" 20 | }, 21 | "problemMatcher": "$msCompile" 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /src/server/Modules/Identity/Modules.Identity.Core/Entities/ExtendedAttributes/RoleExtendedAttribute.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using FluentPOS.Shared.Core.Domain; 10 | 11 | namespace FluentPOS.Modules.Identity.Core.Entities.ExtendedAttributes 12 | { 13 | public class RoleExtendedAttribute : ExtendedAttribute 14 | { 15 | } 16 | } -------------------------------------------------------------------------------- /src/server/Modules/Identity/Modules.Identity.Core/Entities/ExtendedAttributes/UserExtendedAttribute.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using FluentPOS.Shared.Core.Domain; 10 | 11 | namespace FluentPOS.Modules.Identity.Core.Entities.ExtendedAttributes 12 | { 13 | public class UserExtendedAttribute : ExtendedAttribute 14 | { 15 | } 16 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Interfaces/Services/IJobService.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using System.Linq.Expressions; 11 | using System.Threading.Tasks; 12 | 13 | namespace FluentPOS.Shared.Core.Interfaces.Services 14 | { 15 | public interface IJobService 16 | { 17 | string Enqueue(Expression> methodCall); 18 | } 19 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/ForgotPasswordRequest.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.ComponentModel.DataAnnotations; 10 | 11 | namespace FluentPOS.Shared.DTOs.Identity 12 | { 13 | public class ForgotPasswordRequest 14 | { 15 | [Required] 16 | [EmailAddress] 17 | public string Email { get; set; } 18 | } 19 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/ResetPasswordRequest.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.DTOs.Identity 10 | { 11 | public class ResetPasswordRequest 12 | { 13 | public string Email { get; set; } 14 | 15 | public string Password { get; set; } 16 | 17 | public string Token { get; set; } 18 | } 19 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Entities/ExtendedAttributes/CartExtendedAttribute.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Domain; 11 | 12 | namespace FluentPOS.Modules.People.Core.Entities.ExtendedAttributes 13 | { 14 | public class CartExtendedAttribute : ExtendedAttribute 15 | { 16 | } 17 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/IntegrationServices/Application/IEntityReferenceService.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Threading.Tasks; 10 | 11 | namespace FluentPOS.Shared.Core.IntegrationServices.Application 12 | { 13 | public interface IEntityReferenceService 14 | { 15 | public Task TrackAsync(string entityName); 16 | } 17 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/Roles/PermissionRequest.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Collections.Generic; 10 | 11 | namespace FluentPOS.Shared.DTOs.Identity.Roles 12 | { 13 | public class PermissionRequest 14 | { 15 | public string RoleId { get; set; } 16 | 17 | public IList RoleClaims { get; set; } 18 | } 19 | } -------------------------------------------------------------------------------- /.github/workflows/dotnet.yml: -------------------------------------------------------------------------------- 1 | name: .NET 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - name: 🛒 Checkout repository 16 | uses: actions/checkout@v2 17 | 18 | - name: ⚙️ Setup .NET 19 | uses: actions/setup-dotnet@v1 20 | with: 21 | dotnet-version: 5.0.x 22 | 23 | - name: 🧹 Clean 24 | run: dotnet clean src/server/FluentPOS.sln -c Release && dotnet nuget locals all --clear 25 | 26 | - name: 🔁 Restore dependencies 27 | run: dotnet restore 28 | working-directory: src/server 29 | 30 | - name: 🛠️ Build 31 | run: dotnet build --no-restore 32 | working-directory: src/server 33 | 34 | # - name: 🧪 Run unit tests 35 | # run: dotnet test src/server -c Release --no-build 36 | -------------------------------------------------------------------------------- /src/server/Modules/Catalog/Modules.Catalog.Core/Entities/ExtendedAttributes/BrandExtendedAttribute.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Domain; 11 | 12 | namespace FluentPOS.Modules.Catalog.Core.Entities.ExtendedAttributes 13 | { 14 | public class BrandExtendedAttribute : ExtendedAttribute 15 | { 16 | } 17 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Interfaces/IDbContext.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Threading; 10 | using System.Threading.Tasks; 11 | 12 | namespace FluentPOS.Shared.Core.Interfaces 13 | { 14 | public interface IDbContext 15 | { 16 | Task SaveChangesAsync(CancellationToken cancellationToken = default); 17 | 18 | int SaveChanges(); 19 | } 20 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Mails/MailRequest.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.DTOs.Mails 10 | { 11 | public class MailRequest 12 | { 13 | public string To { get; set; } 14 | 15 | public string Subject { get; set; } 16 | 17 | public string Body { get; set; } 18 | 19 | public string From { get; set; } 20 | } 21 | } -------------------------------------------------------------------------------- /src/server/Modules/Catalog/Modules.Catalog.Core/Entities/ExtendedAttributes/ProductExtendedAttribute.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Domain; 11 | 12 | namespace FluentPOS.Modules.Catalog.Core.Entities.ExtendedAttributes 13 | { 14 | public class ProductExtendedAttribute : ExtendedAttribute 15 | { 16 | } 17 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Entities/ExtendedAttributes/CartItemExtendedAttribute.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Domain; 11 | 12 | namespace FluentPOS.Modules.People.Core.Entities.ExtendedAttributes 13 | { 14 | public class CartItemExtendedAttribute : ExtendedAttribute 15 | { 16 | } 17 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Entities/ExtendedAttributes/CustomerExtendedAttribute.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Domain; 11 | 12 | namespace FluentPOS.Modules.People.Core.Entities.ExtendedAttributes 13 | { 14 | public class CustomerExtendedAttribute : ExtendedAttribute 15 | { 16 | } 17 | } -------------------------------------------------------------------------------- /src/server/Modules/Catalog/Modules.Catalog.Core/Entities/ExtendedAttributes/CategoryExtendedAttribute.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Domain; 11 | 12 | namespace FluentPOS.Modules.Catalog.Core.Entities.ExtendedAttributes 13 | { 14 | public class CategoryExtendedAttribute : ExtendedAttribute 15 | { 16 | } 17 | } -------------------------------------------------------------------------------- /src/server/Modules/Sales/Modules.Sales.Core/Mappings/SalesProfile.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using AutoMapper; 6 | using FluentPOS.Modules.Sales.Core.Entities; 7 | using FluentPOS.Modules.Sales.Core.Features.Sales.Queries; 8 | using FluentPOS.Shared.Core.Mappings.Converters; 9 | using FluentPOS.Shared.DTOs.Sales.Orders; 10 | 11 | namespace FluentPOS.Modules.Sales.Core.Mappings 12 | { 13 | public class SalesProfile : Profile 14 | { 15 | public SalesProfile() 16 | { 17 | CreateMap().ReverseMap(); 18 | CreateMap().ReverseMap(); 19 | CreateMap() 20 | .ForMember(dest => dest.OrderBy, opt => opt.ConvertUsing(new OrderByConverter())); 21 | 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/server/Modules/Identity/Modules.Identity.Core/Settings/JwtSettings.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Modules.Identity.Core.Settings 10 | { 11 | public class JwtSettings 12 | { 13 | public string Key { get; set; } 14 | 15 | public int TokenExpirationInMinutes { get; set; } 16 | 17 | public int RefreshTokenExpirationInDays { get; set; } 18 | } 19 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/EventLogging/IEventLogger.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Threading.Tasks; 10 | using FluentPOS.Shared.Core.Domain; 11 | 12 | namespace FluentPOS.Shared.Core.EventLogging 13 | { 14 | public interface IEventLogger 15 | { 16 | Task SaveAsync(T @event, (string oldValues, string newValues) changes) 17 | where T : Event; 18 | } 19 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Upload/UploadRequest.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.DTOs.Upload 10 | { 11 | public class UploadRequest 12 | { 13 | public string FileName { get; set; } 14 | 15 | public string Extension { get; set; } 16 | 17 | public UploadType UploadType { get; set; } 18 | 19 | public string Data { get; set; } 20 | } 21 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/auth/login/login.component.scss: -------------------------------------------------------------------------------- 1 | mat-card { 2 | margin: 5em auto; 3 | text-align: center; 4 | display: block; 5 | margin-left:auto; 6 | margin-right:auto; 7 | } 8 | 9 | mat-form-field { 10 | display: block; 11 | } 12 | 13 | .mat-card-login 14 | { 15 | max-width: 1000px!important; 16 | padding: 0px!important; 17 | } 18 | 19 | @media (max-width: 991px) { 20 | .mat-card-login 21 | { 22 | margin: 40px; 23 | } 24 | } 25 | 26 | .mat-card-content-login 27 | { 28 | padding: 0px!important; 29 | } 30 | 31 | .login-form 32 | { 33 | padding: 40px; 34 | align-self: center; 35 | } 36 | 37 | .login-image 38 | { 39 | background: url('/assets/images/50124-user-profile.gif') no-repeat center #ffffff; 40 | background-position: center; 41 | background-size: cover; 42 | width: 500px; 43 | height: 700px; 44 | border: inset 130px transparent; 45 | box-sizing: border-box; 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/People/Carts/PaginatedCartFilter.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.DTOs.Filters; 11 | 12 | namespace FluentPOS.Shared.DTOs.People.Carts 13 | { 14 | public class PaginatedCartFilter : PaginatedFilter 15 | { 16 | public string SearchString { get; set; } 17 | 18 | public Guid? CustomerId { get; set; } 19 | } 20 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Features/Carts/Commands/CreateCartCommand.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Wrapper; 11 | using MediatR; 12 | 13 | namespace FluentPOS.Modules.People.Core.Features.Carts.Commands 14 | { 15 | public class CreateCartCommand : IRequest> 16 | { 17 | public Guid CustomerId { get; set; } 18 | } 19 | } -------------------------------------------------------------------------------- /src/server/Modules/Sales/Modules.Sales.Core/Features/Sales/Commands/RegisterSaleCommand.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Wrapper; 11 | using MediatR; 12 | 13 | namespace FluentPOS.Modules.Sales.Core.Features.Sales.Commands 14 | { 15 | public class RegisterSaleCommand : IRequest> 16 | { 17 | public Guid CartId { get; set; } 18 | } 19 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/ExtendedAttributes/ExtendedAttributeType.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.DTOs.ExtendedAttributes 10 | { 11 | public enum ExtendedAttributeType : byte 12 | { 13 | Decimal = 1, 14 | 15 | Text = 2, 16 | 17 | DateTime = 3, 18 | 19 | Json = 4, 20 | 21 | Boolean = 5, 22 | 23 | Integer = 6 24 | } 25 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Wrapper/IResult.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Collections.Generic; 10 | 11 | namespace FluentPOS.Shared.Core.Wrapper 12 | { 13 | public interface IResult 14 | { 15 | List Messages { get; set; } 16 | 17 | bool Succeeded { get; set; } 18 | } 19 | 20 | public interface IResult : IResult 21 | { 22 | T Data { get; } 23 | } 24 | } -------------------------------------------------------------------------------- /src/client/src/app/modules/admin/sales/components/order/order-detail/order-detail.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject, OnInit } from '@angular/core'; 2 | import { MAT_DIALOG_DATA } from '@angular/material/dialog'; 3 | import { ToastrService } from 'ngx-toastr'; 4 | import { Order } from '../../../models/order'; 5 | import { SalesService } from '../../../services/sales.service'; 6 | 7 | @Component({ 8 | selector: 'app-order-detail', 9 | templateUrl: './order-detail.component.html', 10 | styleUrls: ['./order-detail.component.scss'] 11 | }) 12 | export class OrderDetailComponent implements OnInit { 13 | order: Order; 14 | 15 | constructor(@Inject(MAT_DIALOG_DATA) public data: Order, private toastr: ToastrService, private saleService: SalesService) { 16 | } 17 | 18 | ngOnInit(): void { 19 | this.saleService.getById(this.data.id).subscribe((response => { 20 | this.order = response.data; 21 | })); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/server/Modules/Sales/Modules.Sales.Infrastructure/Persistence/Migrations/20210818185808_ReferenceNumber.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore.Migrations; 2 | 3 | namespace FluentPOS.Modules.Sales.Infrastructure.Persistence.Migrations 4 | { 5 | public partial class ReferenceNumber : Migration 6 | { 7 | protected override void Up(MigrationBuilder migrationBuilder) 8 | { 9 | migrationBuilder.AddColumn( 10 | name: "ReferenceNumber", 11 | schema: "Sales", 12 | table: "Orders", 13 | type: "text", 14 | nullable: true); 15 | } 16 | 17 | protected override void Down(MigrationBuilder migrationBuilder) 18 | { 19 | migrationBuilder.DropColumn( 20 | name: "ReferenceNumber", 21 | schema: "Sales", 22 | table: "Orders"); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/Roles/PermissionResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Collections.Generic; 10 | 11 | namespace FluentPOS.Shared.DTOs.Identity.Roles 12 | { 13 | public class PermissionResponse 14 | { 15 | public string RoleId { get; set; } 16 | 17 | public string RoleName { get; set; } 18 | 19 | public List RoleClaims { get; set; } 20 | } 21 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Settings/SmsSettings.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.Core.Settings 10 | { 11 | public class SmsSettings 12 | { 13 | public string SmsAccountIdentification { get; set; } 14 | 15 | public string SmsAccountPassword { get; set; } 16 | 17 | public string SmsAccountFrom { get; set; } 18 | 19 | public bool EnableVerification { get; set; } 20 | } 21 | } -------------------------------------------------------------------------------- /src/server/API/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/launchsettings.json", 3 | "iisSettings": { 4 | "windowsAuthentication": false, 5 | "anonymousAuthentication": true, 6 | "iisExpress": { 7 | "applicationUrl": "http://localhost:43695", 8 | "sslPort": 44365 9 | } 10 | }, 11 | "profiles": { 12 | "IIS Express": { 13 | "commandName": "IISExpress", 14 | "launchBrowser": false, 15 | "launchUrl": "swagger", 16 | "environmentVariables": { 17 | "ASPNETCORE_ENVIRONMENT": "Development" 18 | } 19 | }, 20 | "Host": { 21 | "commandName": "Project", 22 | "dotnetRunMessages": "true", 23 | "launchBrowser": false, 24 | "launchUrl": "swagger", 25 | "applicationUrl": "https://localhost:5001;http://localhost:5000", 26 | "environmentVariables": { 27 | "ASPNETCORE_ENVIRONMENT": "Development" 28 | } 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /src/client/src/app/core/api/catalog/brand-api.service.ts: -------------------------------------------------------------------------------- 1 | import {HttpClient, HttpParams} from '@angular/common/http'; 2 | import {Injectable} from '@angular/core'; 3 | import { Brand } from 'src/app/modules/admin/catalog/models/brand'; 4 | import {environment} from 'src/environments/environment'; 5 | 6 | @Injectable() 7 | export class BrandApiService { 8 | 9 | baseUrl = environment.apiUrl + 'catalog/brands/'; 10 | 11 | constructor(private http: HttpClient) { 12 | } 13 | 14 | getAlls(params: HttpParams) { 15 | return this.http.get(this.baseUrl, {params: params}); 16 | } 17 | 18 | getById(id: string) { 19 | return this.http.get(this.baseUrl + id); 20 | } 21 | 22 | create(brand: Brand) { 23 | return this.http.post(this.baseUrl, brand); 24 | } 25 | 26 | update(brand: Brand) { 27 | return this.http.put(this.baseUrl, brand); 28 | } 29 | 30 | delete(id: string) { 31 | return this.http.delete(this.baseUrl + id); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/People/CartItems/GetCartItemsResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.People.CartItems 12 | { 13 | public record GetCartItemsResponse(Guid Id, Guid CartId, Guid ProductId, int Quantity) 14 | { 15 | public string ProductName { get; set; } 16 | public string ProductDescription { get; set; } 17 | public decimal Rate { get; set; } 18 | } 19 | } -------------------------------------------------------------------------------- /src/server/Modules/Inventory/Modules.Inventory.Infrastructure/Persistence/Migrations/20210818162001_added-reference.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.EntityFrameworkCore.Migrations; 2 | 3 | namespace FluentPOS.Modules.Inventory.Infrastructure.Persistence.Migrations 4 | { 5 | public partial class addedreference : Migration 6 | { 7 | protected override void Up(MigrationBuilder migrationBuilder) 8 | { 9 | migrationBuilder.AddColumn( 10 | name: "ReferenceNumber", 11 | schema: "Inventory", 12 | table: "StockTransactions", 13 | type: "text", 14 | nullable: true); 15 | } 16 | 17 | protected override void Down(MigrationBuilder migrationBuilder) 18 | { 19 | migrationBuilder.DropColumn( 20 | name: "ReferenceNumber", 21 | schema: "Inventory", 22 | table: "StockTransactions"); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Catalogs/Products/GetProductByIdResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.Catalogs.Products 12 | { 13 | public record GetProductByIdResponse(Guid Id, string Name, string LocaleName, string BarcodeSymbology, string Detail, Guid BrandId, Guid CategoryId, decimal Price, decimal Cost, string ImageUrl, decimal Tax, string TaxMethod, bool IsAlert, decimal AlertQuantity); 14 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/IntegrationServices/Catalog/IProductService.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using System.Threading.Tasks; 11 | using FluentPOS.Shared.Core.Wrapper; 12 | using FluentPOS.Shared.DTOs.Catalogs.Products; 13 | 14 | namespace FluentPOS.Shared.Core.IntegrationServices.Catalog 15 | { 16 | public interface IProductService 17 | { 18 | Task> GetDetailsAsync(Guid productId); 19 | } 20 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Interfaces/Serialization/IJsonSerializerOptions.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Text.Json; 10 | 11 | namespace FluentPOS.Shared.Core.Interfaces.Serialization 12 | { 13 | public interface IJsonSerializerOptions 14 | { 15 | /// 16 | /// Options for . 17 | /// 18 | public JsonSerializerOptions JsonSerializerOptions { get; } 19 | } 20 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Exceptions/CartNotFoundException.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Net; 10 | using FluentPOS.Shared.Core.Exceptions; 11 | 12 | namespace FluentPOS.Modules.People.Core.Exceptions 13 | { 14 | public class CartNotFoundException : CustomException 15 | { 16 | public CartNotFoundException() 17 | : base("Cart Not Found", null, HttpStatusCode.NotFound) 18 | { 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Interfaces/Serialization/IJsonSerializerSettings.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using Newtonsoft.Json; 10 | 11 | namespace FluentPOS.Shared.Core.Interfaces.Serialization 12 | { 13 | public interface IJsonSerializerSettings 14 | { 15 | /// 16 | /// Settings for . 17 | /// 18 | public JsonSerializerSettings JsonSerializerSettings { get; } 19 | } 20 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/People/CartItems/PaginatedCartItemFilter.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.DTOs.Filters; 11 | 12 | namespace FluentPOS.Shared.DTOs.People.CartItems 13 | { 14 | public class PaginatedCartItemFilter : PaginatedFilter 15 | { 16 | public string SearchString { get; set; } 17 | 18 | public Guid? CartId { get; set; } 19 | 20 | public Guid? ProductId { get; set; } 21 | } 22 | } -------------------------------------------------------------------------------- /src/server/Modules/Sales/Modules.Sales.Core/Features/Sales/Queries/GetSalesQuery.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading; 5 | using System.Threading.Tasks; 6 | using AutoMapper; 7 | using AutoMapper.QueryableExtensions; 8 | using FluentPOS.Modules.Sales.Core.Abstractions; 9 | using FluentPOS.Shared.Core.Mappings.Converters; 10 | using FluentPOS.Shared.Core.Wrapper; 11 | using FluentPOS.Shared.DTOs.Sales.Orders; 12 | using MediatR; 13 | using Microsoft.EntityFrameworkCore; 14 | using Microsoft.Extensions.Localization; 15 | 16 | namespace FluentPOS.Modules.Sales.Core.Features.Sales.Queries 17 | { 18 | public class GetSalesQuery : IRequest> 19 | { 20 | public int PageNumber { get; private set; } 21 | 22 | public int PageSize { get; private set; } 23 | 24 | public string[] OrderBy { get; private set; } 25 | 26 | public string SearchString { get; private set; } 27 | } 28 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Catalogs/Products/PaginatedProductFilter.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.DTOs.Filters; 11 | 12 | namespace FluentPOS.Shared.DTOs.Catalogs.Products 13 | { 14 | public class PaginatedProductFilter : PaginatedFilter 15 | { 16 | public string SearchString { get; set; } 17 | 18 | public Guid[] BrandIds { get; set; } 19 | 20 | public Guid[] CategoryIds { get; set; } 21 | } 22 | } -------------------------------------------------------------------------------- /src/client/src/app/core/api/catalog/category-api.service.ts: -------------------------------------------------------------------------------- 1 | import {Injectable} from '@angular/core'; 2 | import {environment} from '../../../../environments/environment'; 3 | import {HttpClient, HttpParams} from '@angular/common/http'; 4 | import { Category } from 'src/app/modules/admin/catalog/models/category'; 5 | 6 | @Injectable() 7 | export class CategoryApiService { 8 | baseUrl = environment.apiUrl + 'catalog/categories/'; 9 | 10 | constructor(private http: HttpClient) { 11 | } 12 | 13 | getAlls(params: HttpParams) { 14 | return this.http.get(this.baseUrl, {params: params}); 15 | } 16 | 17 | getById(id: string) { 18 | return this.http.get(this.baseUrl + id); 19 | } 20 | 21 | create(category: Category) { 22 | return this.http.post(this.baseUrl, category); 23 | } 24 | 25 | update(category: Category) { 26 | return this.http.put(this.baseUrl, category); 27 | } 28 | 29 | delete(id: string) { 30 | return this.http.delete(this.baseUrl + id); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Catalogs/Products/GetProductsResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.Catalogs.Products 12 | { 13 | public record GetProductsResponse(Guid Id, string Name, string LocaleName, string BarcodeSymbology, string Detail, Guid BrandId, string BrandName, Guid CategoryId, string CategoryName, decimal Price, decimal Cost, string ImageUrl, decimal Tax, string TaxMethod, bool IsAlert, decimal AlertQuantity); 14 | } -------------------------------------------------------------------------------- /src/server/Modules/Identity/Modules.Identity.Infrastructure/Mappings/RoleProfile.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using AutoMapper; 10 | using FluentPOS.Modules.Identity.Core.Entities; 11 | using FluentPOS.Shared.DTOs.Identity.Roles; 12 | 13 | namespace FluentPOS.Modules.Identity.Infrastructure.Mappings 14 | { 15 | public class RoleProfile : Profile 16 | { 17 | public RoleProfile() 18 | { 19 | CreateMap().ReverseMap(); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Domain/Message.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Utilities; 11 | 12 | namespace FluentPOS.Shared.Core.Domain 13 | { 14 | public abstract class Message 15 | { 16 | public string MessageType { get; protected set; } 17 | 18 | public Guid AggregateId { get; protected set; } 19 | 20 | protected Message() 21 | { 22 | MessageType = GetType().GetGenericTypeName(); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /src/server/Modules/Sales/Modules.Sales.Core/Exceptions/SalesException.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Net; 10 | using FluentPOS.Shared.Core.Exceptions; 11 | 12 | namespace FluentPOS.Modules.Catalog.Core.Exceptions 13 | { 14 | public class SalesException : CustomException 15 | { 16 | public SalesException(string message, HttpStatusCode statusCode = HttpStatusCode.InternalServerError) 17 | : base(message, statusCode: statusCode) 18 | { 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/server/Modules/Sales/Modules.Sales/Controllers/BaseController.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using FluentPOS.Shared.Infrastructure.Controllers; 10 | using Microsoft.AspNetCore.Mvc; 11 | 12 | namespace FluentPOS.Modules.Sales.Controllers 13 | { 14 | [ApiController] 15 | [Route(BasePath + "/[controller]")] 16 | internal abstract class BaseController : CommonBaseController 17 | { 18 | protected internal new const string BasePath = CommonBaseController.BasePath + "/sales"; 19 | } 20 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Interfaces/IApplicationDbContext.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using FluentPOS.Shared.Core.Entities; 10 | using FluentPOS.Shared.Core.EventLogging; 11 | using Microsoft.EntityFrameworkCore; 12 | 13 | namespace FluentPOS.Shared.Core.Interfaces 14 | { 15 | public interface IApplicationDbContext : IDbContext 16 | { 17 | public DbSet EventLogs { get; set; } 18 | 19 | public DbSet EntityReferences { get; set; } 20 | } 21 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Exceptions/PeopleException.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Net; 10 | using FluentPOS.Shared.Core.Exceptions; 11 | 12 | namespace FluentPOS.Modules.People.Core.Exceptions 13 | { 14 | public class PeopleException : CustomException 15 | { 16 | public PeopleException(string message, HttpStatusCode statusCode = HttpStatusCode.InternalServerError) 17 | : base(message, statusCode: statusCode) 18 | { 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Features/Carts/Commands/ClearCartCommand.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Wrapper; 11 | using MediatR; 12 | 13 | namespace FluentPOS.Modules.People.Core.Features.Carts.Commands 14 | { 15 | public class ClearCartCommand : IRequest> 16 | { 17 | public Guid Id { get; } 18 | 19 | public ClearCartCommand(Guid cartId) 20 | { 21 | Id = cartId; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People/Controllers/BaseController.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using FluentPOS.Shared.Infrastructure.Controllers; 10 | using Microsoft.AspNetCore.Mvc; 11 | 12 | namespace FluentPOS.Modules.People.Controllers 13 | { 14 | [ApiController] 15 | [Route(BasePath + "/[controller]")] 16 | internal abstract class BaseController : CommonBaseController 17 | { 18 | protected internal new const string BasePath = CommonBaseController.BasePath + "/people"; 19 | } 20 | } -------------------------------------------------------------------------------- /src/server/Modules/Catalog/Modules.Catalog/Controllers/BaseController.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using FluentPOS.Shared.Infrastructure.Controllers; 10 | using Microsoft.AspNetCore.Mvc; 11 | 12 | namespace FluentPOS.Modules.Catalog.Controllers 13 | { 14 | [ApiController] 15 | [Route(BasePath + "/[controller]")] 16 | internal abstract class BaseController : CommonBaseController 17 | { 18 | protected internal new const string BasePath = CommonBaseController.BasePath + "/catalog"; 19 | } 20 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Features/Carts/Commands/RemoveCartCommand.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Wrapper; 11 | using MediatR; 12 | 13 | namespace FluentPOS.Modules.People.Core.Features.Carts.Commands 14 | { 15 | public class RemoveCartCommand : IRequest> 16 | { 17 | public Guid Id { get; } 18 | 19 | public RemoveCartCommand(Guid cartId) 20 | { 21 | Id = cartId; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/IntegrationServices/People/ICartService.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using System.Threading.Tasks; 11 | using FluentPOS.Shared.Core.Wrapper; 12 | using FluentPOS.Shared.DTOs.People.Carts; 13 | 14 | namespace FluentPOS.Shared.Core.IntegrationServices.People 15 | { 16 | public interface ICartService 17 | { 18 | Task> GetDetailsAsync(Guid cartId); 19 | 20 | Task> RemoveCartAsync(Guid cartId); 21 | } 22 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/Roles/RoleClaimRequest.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.DTOs.Identity.Roles 10 | { 11 | public class RoleClaimRequest 12 | { 13 | public int Id { get; set; } 14 | 15 | public string RoleId { get; set; } 16 | 17 | public string Type { get; set; } 18 | 19 | public string Value { get; set; } 20 | 21 | public string Description { get; set; } 22 | 23 | public string Group { get; set; } 24 | } 25 | } -------------------------------------------------------------------------------- /src/client/src/app/core/api/cart/cart-api.service.ts: -------------------------------------------------------------------------------- 1 | import { HttpClient, HttpParams } from '@angular/common/http'; 2 | import { Injectable } from '@angular/core'; 3 | import { environment } from 'src/environments/environment'; 4 | import { CartApiModel } from '../../models/cart/cart'; 5 | import { Result } from '../../models/wrappers/Result'; 6 | 7 | @Injectable({ 8 | providedIn: 'root' 9 | }) 10 | export class CartApiService { 11 | 12 | baseUrl = environment.apiUrl + 'people/carts/'; 13 | 14 | constructor(private http: HttpClient) { 15 | } 16 | create(customerId: string) { 17 | return this.http.post>(this.baseUrl, { "customerId": customerId }); 18 | } 19 | get(customerId: string) { 20 | let params = new HttpParams(); 21 | params = params.append('customerId', customerId); 22 | return this.http.get>(this.baseUrl, { params: params }); 23 | } 24 | clear(cartId: string) 25 | { 26 | return this.http.delete>(this.baseUrl + 'clear/' + cartId); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/server/Modules/Catalog/Modules.Catalog.Core/Exceptions/CatalogException.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Net; 10 | using FluentPOS.Shared.Core.Exceptions; 11 | 12 | namespace FluentPOS.Modules.Catalog.Core.Exceptions 13 | { 14 | public class CatalogException : CustomException 15 | { 16 | public CatalogException(string message, HttpStatusCode statusCode = HttpStatusCode.InternalServerError) 17 | : base(message, statusCode: statusCode) 18 | { 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/server/Modules/Identity/Modules.Identity/Controllers/BaseController.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using FluentPOS.Shared.Infrastructure.Controllers; 10 | using Microsoft.AspNetCore.Mvc; 11 | 12 | namespace FluentPOS.Modules.Identity.Controllers 13 | { 14 | [ApiController] 15 | [Route(BasePath + "/[controller]")] 16 | internal abstract class BaseController : CommonBaseController 17 | { 18 | protected internal new const string BasePath = CommonBaseController.BasePath + "/identity"; 19 | } 20 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Constants/RoleConstants.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.Core.Constants 10 | { 11 | public static class RoleConstants 12 | { 13 | public const string SuperAdmin = "SuperAdmin"; 14 | public const string Admin = "Admin"; 15 | public const string Manager = "Manager"; 16 | public const string Accountant = "Accountant"; 17 | public const string Cashier = "Cashier"; 18 | public const string Staff = "Staff"; 19 | } 20 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/EventLogs/LogEventRequest.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.DTOs.Identity.EventLogs 12 | { 13 | public class LogEventRequest 14 | { 15 | public LogEventRequest() 16 | { 17 | } 18 | 19 | public string Event { get; set; } 20 | 21 | public string Description { get; set; } 22 | 23 | public string Email { get; set; } 24 | 25 | public Guid UserId { get; set; } 26 | } 27 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Identity/Roles/RoleClaimResponse.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | namespace FluentPOS.Shared.DTOs.Identity.Roles 10 | { 11 | public class RoleClaimResponse 12 | { 13 | public int Id { get; set; } 14 | 15 | public string RoleId { get; set; } 16 | 17 | public string Type { get; set; } 18 | 19 | public string Value { get; set; } 20 | 21 | public string Description { get; set; } 22 | 23 | public string Group { get; set; } 24 | } 25 | } -------------------------------------------------------------------------------- /src/server/Modules/Catalog/Modules.Catalog.Core/Features/Brands/Commands/RemoveBrandCommand.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Wrapper; 11 | using MediatR; 12 | 13 | namespace FluentPOS.Modules.Catalog.Core.Features.Brands.Commands 14 | { 15 | public class RemoveBrandCommand : IRequest> 16 | { 17 | public Guid Id { get; } 18 | 19 | public RemoveBrandCommand(Guid brandId) 20 | { 21 | Id = brandId; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/server/Modules/Catalog/Modules.Catalog.Core/Features/Brands/Queries/GetBrandImageQuery.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Wrapper; 11 | using MediatR; 12 | 13 | namespace FluentPOS.Modules.Catalog.Core.Features.Brands.Queries 14 | { 15 | public class GetBrandImageQuery : IRequest> 16 | { 17 | public Guid Id { get; } 18 | 19 | public GetBrandImageQuery(Guid brandId) 20 | { 21 | Id = brandId; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/server/Modules/Catalog/Modules.Catalog.Core/Mappings/ExtendedAttributesProfile.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Reflection; 10 | using AutoMapper; 11 | using FluentPOS.Shared.Core.Extensions; 12 | 13 | namespace FluentPOS.Modules.Catalog.Core.Mappings 14 | { 15 | public class ExtendedAttributesProfile : Profile 16 | { 17 | public ExtendedAttributesProfile() 18 | { 19 | this.CreateExtendedAttributesMappings(Assembly.GetExecutingAssembly()); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Features/CartItems/Commands/AddCartItemCommand.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Wrapper; 11 | using MediatR; 12 | 13 | namespace FluentPOS.Modules.People.Core.Features.CartItems.Commands 14 | { 15 | public class AddCartItemCommand : IRequest> 16 | { 17 | public Guid CartId { get; set; } 18 | 19 | public Guid ProductId { get; set; } 20 | 21 | public int Quantity { get; set; } 22 | } 23 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Mappings/ExtendedAttributesProfile.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Reflection; 10 | using AutoMapper; 11 | using FluentPOS.Shared.Core.Extensions; 12 | 13 | namespace FluentPOS.Modules.People.Core.Mappings 14 | { 15 | public class ExtendedAttributesProfile : Profile 16 | { 17 | public ExtendedAttributesProfile() 18 | { 19 | this.CreateExtendedAttributesMappings(Assembly.GetExecutingAssembly()); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Contracts/IBaseEntity.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Collections.Generic; 10 | using FluentPOS.Shared.Core.Domain; 11 | 12 | namespace FluentPOS.Shared.Core.Contracts 13 | { 14 | public interface IBaseEntity 15 | { 16 | public IReadOnlyCollection DomainEvents { get; } 17 | 18 | public void AddDomainEvent(Event domainEvent); 19 | 20 | public void RemoveDomainEvent(Event domainEvent); 21 | 22 | public void ClearDomainEvents(); 23 | } 24 | } -------------------------------------------------------------------------------- /src/server/Modules/Identity/Modules.Identity.Core/Mappings/ExtendedAttributesProfile.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Reflection; 10 | using AutoMapper; 11 | using FluentPOS.Shared.Core.Extensions; 12 | 13 | namespace FluentPOS.Modules.Identity.Core.Mappings 14 | { 15 | public class ExtendedAttributesProfile : Profile 16 | { 17 | public ExtendedAttributesProfile() 18 | { 19 | this.CreateExtendedAttributesMappings(Assembly.GetExecutingAssembly()); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/server/Modules/Inventory/Modules.Inventory.Core/Exceptions/InventoryException.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.Net; 10 | using FluentPOS.Shared.Core.Exceptions; 11 | 12 | namespace FluentPOS.Modules.Inventory.Core.Exceptions 13 | { 14 | public class InventoryException : CustomException 15 | { 16 | public InventoryException(string message, HttpStatusCode statusCode = HttpStatusCode.InternalServerError) 17 | : base(message, statusCode: statusCode) 18 | { 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.DTOs/Upload/UploadType.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System.ComponentModel; 10 | 11 | namespace FluentPOS.Shared.DTOs.Upload 12 | { 13 | public enum UploadType 14 | { 15 | [Description(@"Images\Catalog\Products")] 16 | Product, 17 | 18 | [Description(@"Images\Catalog\Brands")] 19 | Brand, 20 | 21 | [Description(@"Images\Catalog\Categories")] 22 | Category, 23 | 24 | [Description(@"Images\People\Customers")] 25 | Customer 26 | } 27 | } -------------------------------------------------------------------------------- /src/server/Modules/Catalog/Modules.Catalog.Core/Features/Products/Queries/GetProductImageQuery.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Wrapper; 11 | using MediatR; 12 | 13 | namespace FluentPOS.Modules.Catalog.Core.Features.Products.Queries 14 | { 15 | public class GetProductImageQuery : IRequest> 16 | { 17 | public Guid Id { get; } 18 | 19 | public GetProductImageQuery(Guid productId) 20 | { 21 | Id = productId; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/server/Modules/Inventory/Modules.Inventory.Core/Abstractions/IInventoryDbContext.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using FluentPOS.Modules.Inventory.Core.Entities; 10 | using Microsoft.EntityFrameworkCore; 11 | using FluentPOS.Shared.Core.Interfaces; 12 | 13 | namespace FluentPOS.Modules.Inventory.Core.Abstractions 14 | { 15 | public interface IInventoryDbContext : IDbContext 16 | { 17 | public DbSet Stocks { get; set; } 18 | 19 | public DbSet StockTransactions { get; set; } 20 | } 21 | } -------------------------------------------------------------------------------- /src/server/Shared/Shared.Core/Interfaces/Serialization/IJsonSerializer.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | 11 | namespace FluentPOS.Shared.Core.Interfaces.Serialization 12 | { 13 | public interface IJsonSerializer 14 | { 15 | string Serialize(T obj, IJsonSerializerSettingsOptions settings = null); 16 | 17 | string Serialize(T obj, Type type, IJsonSerializerSettingsOptions settings = null); 18 | 19 | T Deserialize(string text, IJsonSerializerSettingsOptions settings = null); 20 | } 21 | } -------------------------------------------------------------------------------- /src/server/Modules/Catalog/Modules.Catalog.Core/Features/Products/Commands/RemoveProductCommand.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Wrapper; 11 | using MediatR; 12 | 13 | namespace FluentPOS.Modules.Catalog.Core.Features.Products.Commands 14 | { 15 | public class RemoveProductCommand : IRequest> 16 | { 17 | public Guid Id { get; set; } 18 | 19 | public RemoveProductCommand(Guid productId) 20 | { 21 | Id = productId; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/server/Modules/Identity/Modules.Identity.Infrastructure/Permissions/PermissionRequirement.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using Microsoft.AspNetCore.Authorization; 10 | 11 | namespace FluentPOS.Modules.Identity.Infrastructure.Permissions 12 | { 13 | internal class PermissionRequirement : IAuthorizationRequirement 14 | { 15 | public string Permission { get; private set; } 16 | 17 | public PermissionRequirement(string permission) 18 | { 19 | Permission = permission; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Features/CartItems/Commands/RemoveCartItemCommand.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Wrapper; 11 | using MediatR; 12 | 13 | namespace FluentPOS.Modules.People.Core.Features.CartItems.Commands 14 | { 15 | public class RemoveCartItemCommand : IRequest> 16 | { 17 | public Guid Id { get; } 18 | 19 | public RemoveCartItemCommand(Guid cartItemId) 20 | { 21 | Id = cartItemId; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/server/Modules/People/Modules.People.Core/Features/Customers/Commands/RemoveCustomerCommand.cs: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------------------------------------------- 2 | // 3 | // Copyright (c) FluentPOS. All rights reserved. 4 | // The core team: Mukesh Murugan (iammukeshm), Chhin Sras (chhinsras), Nikolay Chebotov (unchase). 5 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 6 | // 7 | // -------------------------------------------------------------------------------------------------- 8 | 9 | using System; 10 | using FluentPOS.Shared.Core.Wrapper; 11 | using MediatR; 12 | 13 | namespace FluentPOS.Modules.People.Core.Features.Customers.Commands 14 | { 15 | public class RemoveCustomerCommand : IRequest> 16 | { 17 | public Guid Id { get; } 18 | 19 | public RemoveCustomerCommand(Guid customerId) 20 | { 21 | Id = customerId; 22 | } 23 | } 24 | } --------------------------------------------------------------------------------