├── 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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
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 |
--------------------------------------------------------------------------------
/src/client/src/app/modules/admin/catalog/components/product/product.component.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
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 | }
--------------------------------------------------------------------------------