Fix: Relations were not working as after setting the id, if the object was none, then it set to None again.
eg. in Inventory if product_id was supplied and not the product object, product_id was set, but then when the product was set to None, the product_id was also gone Version bumped to 7.0.1
This commit is contained in:
parent
58f6d6578b
commit
b7a1c5b816
@ -10,11 +10,10 @@ from sqlalchemy import (
|
|||||||
Boolean,
|
Boolean,
|
||||||
ForeignKey,
|
ForeignKey,
|
||||||
func,
|
func,
|
||||||
DateTime,
|
|
||||||
PickleType,
|
PickleType,
|
||||||
Date,
|
Date,
|
||||||
)
|
)
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship, Session
|
||||||
|
|
||||||
from brewman.models.guidtype import GUID
|
from brewman.models.guidtype import GUID
|
||||||
from .meta import Base
|
from .meta import Base
|
||||||
@ -60,7 +59,7 @@ class Product(Base):
|
|||||||
is_active=None,
|
is_active=None,
|
||||||
is_purchased=None,
|
is_purchased=None,
|
||||||
is_sold=None,
|
is_sold=None,
|
||||||
id=None,
|
id_=None,
|
||||||
is_fixture=False,
|
is_fixture=False,
|
||||||
):
|
):
|
||||||
self.code = code
|
self.code = code
|
||||||
@ -76,20 +75,17 @@ class Product(Base):
|
|||||||
self.is_active = is_active
|
self.is_active = is_active
|
||||||
self.is_purchased = is_purchased
|
self.is_purchased = is_purchased
|
||||||
self.is_sold = is_sold
|
self.is_sold = is_sold
|
||||||
self.id = id
|
self.id = id_
|
||||||
self.is_fixture = is_fixture
|
self.is_fixture = is_fixture
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def full_name(self):
|
def full_name(self):
|
||||||
return "{0} ({1})".format(self.name, self.units)
|
return "{0} ({1})".format(self.name, self.units)
|
||||||
|
|
||||||
def create(self, dbsession):
|
def create(self, db: Session):
|
||||||
code = dbsession.query(func.max(Product.code)).one()[0]
|
code = db.query(func.max(Product.code)).one()[0]
|
||||||
if code is None:
|
self.code = 1 if code is None else code + 1
|
||||||
self.code = 1
|
db.add(self)
|
||||||
else:
|
|
||||||
self.code = code + 1
|
|
||||||
dbsession.add(self)
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def can_delete(self, advanced_delete):
|
def can_delete(self, advanced_delete):
|
||||||
@ -148,7 +144,7 @@ class Recipe(Base):
|
|||||||
valid_to=None,
|
valid_to=None,
|
||||||
notes=None,
|
notes=None,
|
||||||
effective_from=None,
|
effective_from=None,
|
||||||
id=None,
|
id_=None,
|
||||||
):
|
):
|
||||||
self.product_id = product_id
|
self.product_id = product_id
|
||||||
self.quantity = quantity
|
self.quantity = quantity
|
||||||
@ -159,7 +155,7 @@ class Recipe(Base):
|
|||||||
self.notes = "" if notes is None else notes
|
self.notes = "" if notes is None else notes
|
||||||
self.effective_from = date.today() if effective_from is None else effective_from
|
self.effective_from = date.today() if effective_from is None else effective_from
|
||||||
self.effective_to = None
|
self.effective_to = None
|
||||||
self.id = id
|
self.id = id_
|
||||||
|
|
||||||
|
|
||||||
class RecipeItem(Base):
|
class RecipeItem(Base):
|
||||||
@ -174,12 +170,12 @@ class RecipeItem(Base):
|
|||||||
|
|
||||||
product = relationship("Product")
|
product = relationship("Product")
|
||||||
|
|
||||||
def __init__(self, recipe_id=None, product_id=None, quantity=None, price=None, id=None):
|
def __init__(self, recipe_id=None, product_id=None, quantity=None, price=None, id_=None):
|
||||||
self.recipe_id = recipe_id
|
self.recipe_id = recipe_id
|
||||||
self.product_id = product_id
|
self.product_id = product_id
|
||||||
self.quantity = quantity
|
self.quantity = quantity
|
||||||
self.price = price
|
self.price = price
|
||||||
self.id = id
|
self.id = id_
|
||||||
|
|
||||||
|
|
||||||
class ProductGroup(Base):
|
class ProductGroup(Base):
|
||||||
@ -191,9 +187,9 @@ class ProductGroup(Base):
|
|||||||
|
|
||||||
products = relationship("Product", backref="product_group")
|
products = relationship("Product", backref="product_group")
|
||||||
|
|
||||||
def __init__(self, name=None, id=None, is_fixture=False):
|
def __init__(self, name=None, id_=None, is_fixture=False):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.id = id
|
self.id = id_
|
||||||
self.is_fixture = is_fixture
|
self.is_fixture = is_fixture
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -219,9 +215,9 @@ class CostCentre(Base):
|
|||||||
def __name__(self):
|
def __name__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
def __init__(self, name=None, id=None, is_fixture=False):
|
def __init__(self, name=None, id_=None, is_fixture=False):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.id = id
|
self.id = id_
|
||||||
self.is_fixture = is_fixture
|
self.is_fixture = is_fixture
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -274,22 +270,22 @@ class AccountBase(Base):
|
|||||||
self,
|
self,
|
||||||
code=None,
|
code=None,
|
||||||
name=None,
|
name=None,
|
||||||
type=None,
|
type_=None,
|
||||||
is_starred=None,
|
is_starred=None,
|
||||||
is_active=None,
|
is_active=None,
|
||||||
is_reconcilable=False,
|
is_reconcilable=False,
|
||||||
cost_centre_id=None,
|
cost_centre_id=None,
|
||||||
id=None,
|
id_=None,
|
||||||
is_fixture=False,
|
is_fixture=False,
|
||||||
):
|
):
|
||||||
self.code = code
|
self.code = code
|
||||||
self.name = name
|
self.name = name
|
||||||
self.type = type
|
self.type = type_
|
||||||
self.is_starred = is_starred
|
self.is_starred = is_starred
|
||||||
self.is_active = is_active
|
self.is_active = is_active
|
||||||
self.is_reconcilable = is_reconcilable
|
self.is_reconcilable = is_reconcilable
|
||||||
self.cost_centre_id = cost_centre_id
|
self.cost_centre_id = cost_centre_id
|
||||||
self.id = id
|
self.id = id_
|
||||||
self.is_fixture = is_fixture
|
self.is_fixture = is_fixture
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -308,21 +304,15 @@ class AccountBase(Base):
|
|||||||
query_ = query_.filter(cls.name.ilike("%" + item + "%"))
|
query_ = query_.filter(cls.name.ilike("%" + item + "%"))
|
||||||
return query_.order_by(cls.name)
|
return query_.order_by(cls.name)
|
||||||
|
|
||||||
def create(self, dbsession):
|
def create(self, db: Session):
|
||||||
code = dbsession.query(func.max(AccountBase.code)).filter(AccountBase.type == self.type).one()[0]
|
code = db.query(func.max(AccountBase.code)).filter(AccountBase.type == self.type).one()[0]
|
||||||
if code is None:
|
self.code = 1 if code is None else code + 1
|
||||||
self.code = 1
|
db.add(self)
|
||||||
else:
|
|
||||||
self.code = code + 1
|
|
||||||
dbsession.add(self)
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def can_delete(self, advanced_delete):
|
def can_delete(self, advanced_delete):
|
||||||
if self.is_fixture:
|
if self.is_fixture:
|
||||||
return (
|
return False, f"{self.name} is a fixture and cannot be edited or deleted."
|
||||||
False,
|
|
||||||
"{0} is a fixture and cannot be edited or deleted.".format(self.name),
|
|
||||||
)
|
|
||||||
if self.is_active:
|
if self.is_active:
|
||||||
return False, "Account is active"
|
return False, "Account is active"
|
||||||
if len(self.journals) > 0 and not advanced_delete:
|
if len(self.journals) > 0 and not advanced_delete:
|
||||||
@ -330,8 +320,8 @@ class AccountBase(Base):
|
|||||||
return True, ""
|
return True, ""
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_code(cls, type, dbsession):
|
def get_code(cls, type_, db: Session):
|
||||||
code = dbsession.query(func.max(AccountBase.code)).filter(AccountBase.type == type).one()[0]
|
code = db.query(func.max(AccountBase.code)).filter(AccountBase.type == type_).one()[0]
|
||||||
return 1 if code is None else code + 1
|
return 1 if code is None else code + 1
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -410,21 +400,18 @@ class Employee(AccountBase):
|
|||||||
super().__init__(
|
super().__init__(
|
||||||
code=code,
|
code=code,
|
||||||
name=name,
|
name=name,
|
||||||
type=10,
|
type_=10,
|
||||||
is_starred=is_starred,
|
is_starred=is_starred,
|
||||||
is_active=is_active,
|
is_active=is_active,
|
||||||
is_reconcilable=False,
|
is_reconcilable=False,
|
||||||
cost_centre_id=cost_centre_id,
|
cost_centre_id=cost_centre_id,
|
||||||
)
|
)
|
||||||
|
|
||||||
def create(self, dbsession):
|
def create(self, db: Session):
|
||||||
code = dbsession.query(func.max(AccountBase.code)).filter(AccountBase.type == self.type).one()[0]
|
code = db.query(func.max(AccountBase.code)).filter(AccountBase.type == self.type).one()[0]
|
||||||
if code is None:
|
self.code = 1 if code in None else code + 1
|
||||||
self.code = 1
|
self.name += f" ({str(self.code)})"
|
||||||
else:
|
db.add(self)
|
||||||
self.code = code + 1
|
|
||||||
self.name += " (" + str(self.code) + ")"
|
|
||||||
dbsession.add(self)
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def can_delete(self, advanced_delete):
|
def can_delete(self, advanced_delete):
|
||||||
@ -466,24 +453,18 @@ class AttendanceType:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def by_name(cls, name):
|
def by_name(cls, name):
|
||||||
list = cls.list()
|
next(i for i in cls.list() if i.name == name)
|
||||||
for item in list:
|
|
||||||
if item.name == name:
|
|
||||||
return item
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def by_id(cls, id):
|
def by_id(cls, id_):
|
||||||
list = cls.list()
|
next(i for i in cls.list() if i.id == id_)
|
||||||
for item in list:
|
|
||||||
if item.id == id:
|
|
||||||
return item
|
|
||||||
|
|
||||||
|
|
||||||
class AccountType:
|
class AccountType:
|
||||||
def __init__(
|
def __init__(
|
||||||
self, id, name, balance_sheet=None, debit=None, cash_flow_classification=None, order=None, show_in_list=None,
|
self, id_, name, balance_sheet=None, debit=None, cash_flow_classification=None, order=None, show_in_list=None,
|
||||||
):
|
):
|
||||||
self.id = id
|
self.id = id_
|
||||||
self.name = name
|
self.name = name
|
||||||
self.balance_sheet = balance_sheet
|
self.balance_sheet = balance_sheet
|
||||||
self.debit = debit
|
self.debit = debit
|
||||||
@ -498,7 +479,7 @@ class AccountType:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def list(cls):
|
def list(cls):
|
||||||
list = [
|
return [
|
||||||
AccountType(1, "Cash", True, True, "Cash", 10, True),
|
AccountType(1, "Cash", True, True, "Cash", 10, True),
|
||||||
AccountType(2, "Purchase", False, True, "Operating", 20, True),
|
AccountType(2, "Purchase", False, True, "Operating", 20, True),
|
||||||
AccountType(3, "Sale", False, False, "Operating", 10, True),
|
AccountType(3, "Sale", False, False, "Operating", 10, True),
|
||||||
@ -515,21 +496,14 @@ class AccountType:
|
|||||||
# list.append(AccountType(8, 'Discount', False, False, True, 30, True))
|
# list.append(AccountType(8, 'Discount', False, False, True, 30, True))
|
||||||
# list.append(AccountType(14, 'Total', False, False, False, 900, False))
|
# list.append(AccountType(14, 'Total', False, False, False, 900, False))
|
||||||
# list.append(AccountType(15, 'Net', False, False, False, 1000, False))
|
# list.append(AccountType(15, 'Net', False, False, False, 1000, False))
|
||||||
return list
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def by_name(cls, name):
|
def by_name(cls, name):
|
||||||
list = cls.list()
|
next(i for i in cls.list() if i.name == name)
|
||||||
for item in list:
|
|
||||||
if item.name == name:
|
|
||||||
return item
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def by_id(cls, id):
|
def by_id(cls, id_):
|
||||||
list = cls.list()
|
next(i for i in cls.list() if i.id == id_)
|
||||||
for item in list:
|
|
||||||
if item.id == id:
|
|
||||||
return item
|
|
||||||
|
|
||||||
|
|
||||||
class DbSetting(Base):
|
class DbSetting(Base):
|
||||||
@ -539,7 +513,7 @@ class DbSetting(Base):
|
|||||||
name = Column("name", Unicode(255), unique=True, nullable=False)
|
name = Column("name", Unicode(255), unique=True, nullable=False)
|
||||||
data = Column("data", PickleType)
|
data = Column("data", PickleType)
|
||||||
|
|
||||||
def __init__(self, id=None, name=None, data=None):
|
def __init__(self, id_=None, name=None, data=None):
|
||||||
self.id = id
|
self.id = id_
|
||||||
self.name = name
|
self.name = name
|
||||||
self.data = data
|
self.data = data
|
||||||
|
@ -196,14 +196,15 @@ class EmployeeBenefit(Base):
|
|||||||
):
|
):
|
||||||
self.id = id_
|
self.id = id_
|
||||||
self.voucher_id = voucher_id
|
self.voucher_id = voucher_id
|
||||||
self.journal_id = journal_id
|
|
||||||
self.gross_salary = gross_salary
|
self.gross_salary = gross_salary
|
||||||
self.days_worked = days_worked
|
self.days_worked = days_worked
|
||||||
self.esi_ee = esi_ee
|
self.esi_ee = esi_ee
|
||||||
self.pf_ee = pf_ee
|
self.pf_ee = pf_ee
|
||||||
self.esi_er = esi_er
|
self.esi_er = esi_er
|
||||||
self.pf_er = pf_er
|
self.pf_er = pf_er
|
||||||
if journal_id is None and journal is not None:
|
if journal is None:
|
||||||
|
self.journal_id = journal_id
|
||||||
|
else:
|
||||||
self.journal = journal
|
self.journal = journal
|
||||||
|
|
||||||
|
|
||||||
@ -224,9 +225,10 @@ class Incentive(Base):
|
|||||||
self.voucher_id = voucher_id
|
self.voucher_id = voucher_id
|
||||||
if journal is None:
|
if journal is None:
|
||||||
self.journal_id = journal_id
|
self.journal_id = journal_id
|
||||||
|
else:
|
||||||
|
self.journal = journal
|
||||||
self.days_worked = days_worked
|
self.days_worked = days_worked
|
||||||
self.points = points
|
self.points = points
|
||||||
self.journal = journal
|
|
||||||
|
|
||||||
|
|
||||||
class Inventory(Base):
|
class Inventory(Base):
|
||||||
@ -260,14 +262,16 @@ class Inventory(Base):
|
|||||||
self.voucher_id = voucher_id
|
self.voucher_id = voucher_id
|
||||||
if product is None:
|
if product is None:
|
||||||
self.product_id = product_id
|
self.product_id = product_id
|
||||||
|
else:
|
||||||
|
self.product = product
|
||||||
if batch is None:
|
if batch is None:
|
||||||
self.batch_id = batch_id
|
self.batch_id = batch_id
|
||||||
|
else:
|
||||||
|
self.batch = batch
|
||||||
self.quantity = quantity
|
self.quantity = quantity
|
||||||
self.rate = rate
|
self.rate = rate
|
||||||
self.tax = tax
|
self.tax = tax
|
||||||
self.discount = discount
|
self.discount = discount
|
||||||
self.batch = batch
|
|
||||||
self.product = product
|
|
||||||
|
|
||||||
@hybrid_property
|
@hybrid_property
|
||||||
def amount(self):
|
def amount(self):
|
||||||
@ -298,7 +302,8 @@ class Batch(Base):
|
|||||||
self.discount = discount
|
self.discount = discount
|
||||||
if product is None:
|
if product is None:
|
||||||
self.product_id = product_id
|
self.product_id = product_id
|
||||||
self.product = product
|
else:
|
||||||
|
self.product = product
|
||||||
|
|
||||||
def amount(self):
|
def amount(self):
|
||||||
return self.quantity_remaining * self.rate * (1 + self.tax) * (1 - self.discount)
|
return self.quantity_remaining * self.rate * (1 + self.tax) * (1 - self.discount)
|
||||||
@ -364,7 +369,7 @@ class Attendance(Base):
|
|||||||
if old is None or old.attendance_type != self.attendance_type:
|
if old is None or old.attendance_type != self.attendance_type:
|
||||||
if old is not None:
|
if old is not None:
|
||||||
old.is_valid = False
|
old.is_valid = False
|
||||||
dbsession.add(self)
|
db.add(self)
|
||||||
|
|
||||||
|
|
||||||
class Fingerprint(Base):
|
class Fingerprint(Base):
|
||||||
@ -374,8 +379,8 @@ class Fingerprint(Base):
|
|||||||
employee_id = Column("employee_id", GUID(), ForeignKey("employees.id"))
|
employee_id = Column("employee_id", GUID(), ForeignKey("employees.id"))
|
||||||
date = Column("date", DateTime)
|
date = Column("date", DateTime)
|
||||||
|
|
||||||
def __init__(self, id=None, employee_id=None, date=None):
|
def __init__(self, id_=None, employee_id=None, date=None):
|
||||||
self.id = id
|
self.id = id_
|
||||||
self.employee_id = employee_id
|
self.employee_id = employee_id
|
||||||
self.date = date
|
self.date = date
|
||||||
self.fingerprint_type = 0
|
self.fingerprint_type = 0
|
||||||
|
@ -44,6 +44,7 @@ def rebase(
|
|||||||
db.add(voucher_l)
|
db.add(voucher_l)
|
||||||
for j in voucher_l.journals:
|
for j in voucher_l.journals:
|
||||||
db.add(j)
|
db.add(j)
|
||||||
|
db.flush()
|
||||||
db.add(voucher_b)
|
db.add(voucher_b)
|
||||||
for j in voucher_b.journals:
|
for j in voucher_b.journals:
|
||||||
db.add(j)
|
db.add(j)
|
||||||
@ -86,6 +87,10 @@ def save_starred(date_: date, db: Session):
|
|||||||
for other in others:
|
for other in others:
|
||||||
if voucher.type != VoucherType.by_name("Opening Accounts").id:
|
if voucher.type != VoucherType.by_name("Opening Accounts").id:
|
||||||
voucher.narration += f"\nSuspense \u20B9{other.amount:,.2f} is {other.account.name}"
|
voucher.narration += f"\nSuspense \u20B9{other.amount:,.2f} is {other.account.name}"
|
||||||
|
if other.employee_benefit:
|
||||||
|
db.delete(other.employee_benefit)
|
||||||
|
if other.incentive:
|
||||||
|
db.delete(other.incentive)
|
||||||
db.delete(other)
|
db.delete(other)
|
||||||
voucher.type = VoucherType.by_name("Journal")
|
voucher.type = VoucherType.by_name("Journal")
|
||||||
if len(voucher.narration) >= 1000:
|
if len(voucher.narration) >= 1000:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "overlord",
|
"name": "overlord",
|
||||||
"version": "7.0.0",
|
"version": "7.0.1",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"start": "ng serve",
|
"start": "ng serve",
|
||||||
|
2
setup.py
2
setup.py
@ -11,7 +11,7 @@ with open(os.path.join(here, 'requirements.txt'), "r") as r:
|
|||||||
requires = r.read().splitlines()
|
requires = r.read().splitlines()
|
||||||
|
|
||||||
setup(name='brewman',
|
setup(name='brewman',
|
||||||
version='7.0',
|
version='7.0.1',
|
||||||
description='brewman',
|
description='brewman',
|
||||||
long_description=README + '\n\n' + CHANGES,
|
long_description=README + '\n\n' + CHANGES,
|
||||||
classifiers=[
|
classifiers=[
|
||||||
|
Loading…
x
Reference in New Issue
Block a user