AZ
Andrew Zimba

P O S - Copy this React, Tailwind Component to your project

Create a POS window that fills the entire page to and it should like a typical pos window. below is a model for glass quotations and you can borrow fields to use package com.flexMeasure.flexMeasure.model; import jakarta.persistence.*; import jakarta.validation.constraints.*; import lombok.*; import org.hibernate.annotations.DynamicUpdate; import com.flexMeasure.flexMeasure.utils.DecimalUtils; import java.math.BigDecimal; import java.time.LocalDateTime; @Entity @Table(name = "glass_quotation") @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder @DynamicUpdate public class GlassQuotation { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotBlank(message = "Invoice number is required") @Column(nullable = false, unique = true) @Size(max = 50) private String invoiceNumber; @NotBlank(message = "Item code is required") @Column(nullable = false) @Size(max = 50) private String itemCode; @Column(columnDefinition = "TEXT") private String description; @NotNull(message = "Quantity is required") @Positive(message = "Quantity must be positive") @Column(nullable = false) private Integer quantity; @NotNull(message = "Unit price is required") @Positive(message = "Unit price must be positive") @Column(nullable = false, precision = 10, scale = 2) private BigDecimal unit; @NotNull(message = "Amount is required") @PositiveOrZero(message = "Amount must not be negative") @Column(nullable = false, precision = 10, scale = 2) private BigDecimal amount; @NotNull(message = "Length is required") @Positive(message = "Length must be positive") @Column(nullable = false, precision = 10, scale = 2) private BigDecimal length; @NotNull(message = "Width is required") @Positive(message = "Width must be positive") @Column(nullable = false, precision = 10, scale = 2) private BigDecimal width; @NotNull(message = "Area is required") @Positive(message = "Area must be positive") @Column(nullable = false, precision = 10, scale = 2) private BigDecimal area; @NotNull(message = "Amount tendered is required") @PositiveOrZero(message = "Amount tendered must not be negative") @Column(nullable = false, precision = 10, scale = 2) private BigDecimal amountTendered; @Column(nullable = false, precision = 10, scale = 2) private BigDecimal change; @NotNull(message = "Subtotal is required") @PositiveOrZero(message = "Subtotal must not be negative") @Column(nullable = false, precision = 10, scale = 2) private BigDecimal subTotal; @NotNull(message = "VAT is required") @PositiveOrZero(message = "VAT must not be negative") @Column(nullable = false, precision = 10, scale = 2) private BigDecimal vat; @NotNull(message = "Grand total is required") @PositiveOrZero(message = "Grand total must not be negative") @Column(nullable = false, precision = 10, scale = 2) private BigDecimal grandTotal; @NotBlank(message = "User ID is required") @Column(nullable = false) private String userId; @NotBlank(message = "Customer name is required") @Column(nullable = false, length = 100) @Size(max = 100) private String customerName; @NotBlank(message = "Address is required") @Column(nullable = false, length = 200) @Size(max = 200) private String address; @NotBlank(message = "City is required") @Column(nullable = false, length = 100) @Size(max = 100) private String city; @NotBlank(message = "Phone is required") @Column(nullable = false, length = 20) @Size(max = 20) private String phone; @Column(nullable = false) private Integer nat; @Column(nullable = false) private Integer dpt; @NotNull(message = "Paid status is required") @Column(nullable = false) private Boolean paid; @NotNull(message = "Glass quantity is required") @PositiveOrZero(message = "Glass quantity must not be negative") @Column(nullable = false) private Integer glassQty; @NotNull(message = "General quantity is required") @PositiveOrZero(message = "General quantity must not be negative") @Column(nullable = false) private Integer genQty; @NotNull(message = "Discount amount is required") @PositiveOrZero(message = "Discount amount must not be negative") @Column(nullable = false, precision = 10, scale = 2) private BigDecimal discountAmount; @NotNull(message = "Discount percentage is required") @PositiveOrZero(message = "Discount percentage must not be negative") @Column(nullable = false, precision = 5, scale = 2) private BigDecimal discountPct; @NotNull(message = "Order number is required") @Positive(message = "Order number must be positive") @Column(nullable = false) private Integer orderNumber; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "glass_id", nullable = false) @NotNull(message = "Glass master is required") private GlassMaster glass; @Column(nullable = false) private LocalDateTime buildDate; @Column(name = "created_at", nullable = false, updatable = false) private LocalDateTime createdAt; @Column(name = "updated_at", nullable = false) private LocalDateTime updatedAt; @Version private Long version; @PrePersist protected void onCreate() { this.createdAt = LocalDateTime.now(); this.updatedAt = LocalDateTime.now(); this.buildDate = LocalDateTime.now(); initializeFields(); calculateFields(); } @PreUpdate protected void onUpdate() { this.updatedAt = LocalDateTime.now(); validateAmounts(); calculateFields(); } private void initializeFields() { // Initialize amounts and quantities to zero if null this.amount = (this.amount == null) ? BigDecimal.ZERO : this.amount; this.discountAmount = (this.discountAmount == null) ? BigDecimal.ZERO : this.discountAmount; this.discountPct = (this.discountPct == null) ? BigDecimal.ZERO : this.discountPct; this.subTotal = (this.subTotal == null) ? BigDecimal.ZERO : this.subTotal; this.vat = (this.vat == null) ? BigDecimal.ZERO : this.vat; this.grandTotal = (this.grandTotal == null) ? BigDecimal.ZERO : this.grandTotal; this.amountTendered = (this.amountTendered == null) ? BigDecimal.ZERO : this.amountTendered; this.change = (this.change == null) ? BigDecimal.ZERO : this.change; this.glassQty = (this.glassQty == null) ? 0 : this.glassQty; this.genQty = (this.genQty == null) ? 0 : this.genQty; this.quantity = (this.quantity == null) ? 0 : this.quantity; } private void calculateFields() { if (length != null && width != null) { this.area = length.multiply(width).setScale(2, BigDecimal.ROUND_HALF_UP); } if (unit != null && quantity != null) { this.amount = unit.multiply(new BigDecimal(quantity)).setScale(2, BigDecimal.ROUND_HALF_UP); } if (amount != null && discountPct != null) { this.discountAmount = amount.multiply(discountPct).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP); } if (amount != null && discountAmount != null) { this.subTotal = amount.subtract(discountAmount).setScale(2, BigDecimal.ROUND_HALF_UP); } if (subTotal != null) { this.vat = subTotal.multiply(new BigDecimal("0.16")).setScale(2, BigDecimal.ROUND_HALF_UP); // VAT rate of 16% } if (subTotal != null && vat != null) { this.grandTotal = subTotal.add(vat).setScale(2, BigDecimal.ROUND_HALF_UP); } if (grandTotal != null && amountTendered != null) { this.change = amountTendered.subtract(grandTotal).setScale(2, BigDecimal.ROUND_HALF_UP); } } private void validateAmounts() { if (this.amountTendered != null && this.grandTotal != null && this.amountTendered.compareTo(this.grandTotal) < 0) { throw new IllegalStateException("Amount tendered cannot be less than grand total"); } } }

Prompt
Component Preview

About

POS - A full-page POS window featuring invoice management, item details, and customer info, professionally built with React and Tailwind. View and copy code!

Share

Last updated 1 month ago