# coding=UTF-8 from datetime import datetime from java.text import SimpleDateFormat from common._common_orm import linesOfNumbersSeriesCursor from ru.curs.celesta import CelestaException def getSeriesParams(context, seriesId): linesOfNumbersSeries = linesOfNumbersSeriesCursor(context) linesOfNumbersSeries.setRange('seriesId', seriesId) linesOfNumbersSeries.setRange('isOpened', True) linesOfNumbersSeries.setRange('startingDate', datetime.strptime('1900-01-01', '%Y-%m-%d'), datetime.today()) if linesOfNumbersSeries.count() > 1: CelestaException("There is more than one opened line in the series '%s'" % seriesId) if linesOfNumbersSeries.tryFirst(): return {'numberOfLine': linesOfNumbersSeries.numberOfLine, 'startingDate': SimpleDateFormat("dd.MM.yyyy").format(linesOfNumbersSeries.startingDate) if linesOfNumbersSeries.startingDate else '', 'startingNumber': linesOfNumbersSeries.startingNumber, 'endingNumber': linesOfNumbersSeries.endingNumber, 'incrimentByNumber': linesOfNumbersSeries.incrimentByNumber, 'lastUsedNumber': linesOfNumbersSeries.lastUsedNumber, 'prefix': linesOfNumbersSeries.prefix, 'postfix': linesOfNumbersSeries.postfix, 'isFixedLength': linesOfNumbersSeries.isFixedLength, 'isOpened': linesOfNumbersSeries.isOpened, 'lastUsedDate': SimpleDateFormat("dd.MM.yyyy").format(linesOfNumbersSeries.lastUsedDate) if linesOfNumbersSeries.lastUsedDate else ""} else: CelestaException("There are no available opened lines in the series '%s'!" % seriesId) def getNextNoOfSeries(context, seriesId, linesOfNumbersSeries=None, updateNum=True): lonsFlag = False if linesOfNumbersSeries is None: linesOfNumbersSeries = linesOfNumbersSeriesCursor(context) lonsFlag = True linesOfNumbersSeries.setRange('seriesId', seriesId) linesOfNumbersSeries.setRange('isOpened', True) linesOfNumbersSeries.setRange('startingDate', datetime.strptime('1900-01-01', '%Y-%m-%d'), datetime.today()) if linesOfNumbersSeries.count() > 1: raise Exception("There is more than one opened line in the series '%s'" % seriesId) if linesOfNumbersSeries.tryFindSet(): seriesObject = GettingNextNumberOfSeries(seriesId, linesOfNumbersSeries.lastUsedNumber, linesOfNumbersSeries.startingNumber, linesOfNumbersSeries.endingNumber, linesOfNumbersSeries.incrimentByNumber, linesOfNumbersSeries.isFixedLength) nextNum = seriesObject.getNextNum() linesOfNumbersSeries.lastUsedNumber = int(nextNum) linesOfNumbersSeries.lastUsedDate = datetime.today() if updateNum: linesOfNumbersSeries.update() prefix = linesOfNumbersSeries.prefix postfix = linesOfNumbersSeries.postfix if lonsFlag: linesOfNumbersSeries.close() return '%s%s%s' % (prefix, nextNum, postfix) else: CelestaException("There are no available opened lines in the series '%s'!" % seriesId) class GettingNextNumberOfSeries(): def __init__(self, seriesId, lastUsed, startNum=0, endNum=0, incr=1, isFixedLength=True): self.seriesId = seriesId self.startNum = startNum self.endNum = endNum self.lastUsed = lastUsed self.isFixedLength = isFixedLength self.incr = incr if incr >= 1 else 1 if int(self.startNum) > int(self.endNum): raise Exception('Min value is greater than max value for series %s' % self.seriesId) def getNextNum(self): """Finding next num""" if not self.lastUsed: return unicode(self.startNum) elif self.lastUsed < self.endNum: nextNum = unicode(self.lastUsed + self.incr) if int(nextNum) > self.endNum: raise Exception('Next number value is greater than max value for series %s' % self.seriesId) if self.isFixedLength: nextNum = '0' * (len(unicode(self.endNum)) - len(nextNum)) + nextNum """If nextNum == '2' but it should be like '0002' """ else: raise CelestaException('Last used value is greater than max value for series %s' % self.seriesId) return nextNum