diff options
Diffstat (limited to 'item/validators.go')
-rw-r--r-- | item/validators.go | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/item/validators.go b/item/validators.go new file mode 100644 index 0000000..09162ab --- /dev/null +++ b/item/validators.go @@ -0,0 +1,111 @@ +/* openbills - Server for web based Libre Billing Software + * Copyright (C) 2023 Vidhu Kant Sharma <vidhukant@vidhukant.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +package item + +import ( + "strconv" + "strings" + + "vidhukant.com/openbills/errors" +) + +func (b *Brand) validate() error { + // trim whitespaces + b.Name = strings.TrimSpace(b.Name) + + if b.Name == "" { + return errors.ErrEmptyBrandName + } + + // make sure GSTIN is unique + var count int64 + err := db.Model(&Brand{}). + Select("name"). + Where("name = ?", b.Name). + Count(&count). + Error + + if err != nil { + return err + } + + if count > 0 { + return errors.ErrNonUniqueBrandName + } + + return nil +} + +func checkIfBrandExists(id uint) error { + // check if brand id is valid + var count int64 + err := db.Model(&Brand{}). + Select("id"). + Where("id = ?", id). + Count(&count). + Error + + if err != nil { + return err + } + + if count == 0 { + return errors.ErrBrandNotFound + } + + return nil +} + +func (i *SavedItem) validate() error { + // trim whitespaces + i.Name = strings.TrimSpace(i.Name) + i.Description = strings.TrimSpace(i.Description) + i.HSN = strings.TrimSpace(i.HSN) + + var err error + + // check if UnitPrice is float + _, err = strconv.ParseFloat(i.UnitPrice, 64) + if err != nil && strings.TrimSpace(i.UnitPrice) != "" { + return errors.ErrInvalidUnitPrice + } + + // check if GSTPercentage is float + _, err = strconv.ParseFloat(i.GSTPercentage, 64) + if err != nil && strings.TrimSpace(i.GSTPercentage) != "" { + return errors.ErrInvalidGSTPercentage + } + + // check if item with same name and brand already exists + var count int64 + err = db.Model(&SavedItem{}). + Select("name, brand_id"). + Where("brand_id = ? and name = ?", i.BrandID, i.Name). + Count(&count). + Error + + if err != nil { + return err + } + + if count != 0 { + return errors.ErrNonUniqueBrandItem + } + + return nil +} |