def make_inv_movement(self, work): invmeta = InvMovementMeta() doc = work.content if work.objtype == WorkObject.INV_TRANS: invmeta.timestamp = doc.meta.timestamp invmeta.value_usd = Decimal(doc.meta.subtotal - (doc.meta.discount or 0)) / 100 invmeta.inventory_docid = doc.meta.uid invmeta.trans_type = InvMovementType.SALE invmeta.origin = doc.meta.bodega_id invmeta.dest = -1 else: invmeta.timestamp = doc.meta.timestamp invmeta.value_usd = doc.meta.value invmeta.inventory_docid = doc.meta.uid invmeta.origin = doc.meta.origin invmeta.dest = doc.meta.dest invmeta.trans_type = transtype_to_invtype(doc.meta.trans_type) invmeta.inventory_codename = self.codename items = [] if work.action == WorkObject.DELETE: invmeta.origin, invmeta.dest = invmeta.dest, invmeta.origin invmeta.trans_type = InvMovementType.delete_type(invmeta.trans_type) invmeta.timestamp = datetime.datetime.now() # record delete time which is different than invoice time for trans in doc.items_to_transaction(self.dbapi): itemgroup = self.dbapi.get(trans.itemgroup_id, ProdItemGroup) items.append(ItemGroupCant(cant=trans.quantity, itemgroup=itemgroup)) return InvMovementFull(meta=invmeta, items=items)
def _set_status_and_update_prod_count( self, doc, new_status, inverse_transaction): session = self.db_session.session now = datetime.datetime.now() try: items = list(doc.items_to_transaction(self.dbapi)) for i in items: if inverse_transaction: i.type = InvMovementType.delete_type(i.type) i.inverse() i.timestamp = now self.transaction.bulk_save(items) session.query(self.db_class).filter_by( id=doc.meta.uid).update({'status': new_status}) session.commit() doc.meta.status = new_status return True except SQLAlchemyError: import traceback traceback.print_exc() session.rollback() return False