【问题标题】:Resetting invoice number automatically when fiscal year changes会计年度更改时自动重置发票编号
【发布时间】:2019-10-24 13:10:45
【问题描述】:

我有一个生成发票的脚本。我在 db table invoice 中有一个字段 invoice_no (格式:INV-yyyymm-0001,这里 0001 应该为每个发票递增,直到下一个会计年度),在会计年度更改后应该重置为 001。 例如:如果发票编号为 INV-201903-2111 ,则在 2019 年 3 月 31 日之后应自动更改为 INV-201904-0001 而不是 INV-201904-2112

我已将会计年度的开始和结束存储在一个包含 Fyear、fsYear、feYear 的表中。每当我生成新发票时,它必须使用 Fyear 检查当前年份,然后检查开始和结束日期,如果当前日期使用 fsYear 和 feYear,则它必须重置为 001,然后递增直到该财政年度结束。我该如何实现它?

这是桌子

INSERT INTO `fyear` (`id`, `fyYear`, `fyStart`, `fyEnd`) VALUES
(1, 2019, '2019-04-01', '2020-03-31'),
(2, 2020, '2020-04-01', '2021-03-31');

我尝试创建一个函数来获取开始和结束日期 $cdate = date('Y-m-d'); $cyear = date("Y");

function GetFdate($Fyear, $Fstdate, $feddate)
{
$m1 = mysqli_query($con, "SELECT * FROM fyear WHERE fyYear='".$cyear."'");
$m2 = mysqli_fetch_array($m1);

$sYear = $m2['fyStart'];
$eYear = $m2['fyEnd'];  
}

但不知道如何增加发票编号然后重置。

这是我的架构:

CREATE TABLE `sales_invoice` (
  `invoice_id` int(10) NOT NULL,
  `invoice_no` varchar(50) NOT NULL,
  `order_id` varchar(50) NOT NULL,
  `customer` int(10) NOT NULL,
  `contact_person` int(10) NOT NULL,
  `validity` int(10) NOT NULL,
  `payment` varchar(100) NOT NULL,
  `date_invoiced` date NOT NULL,
  `status` varchar(20) NOT NULL,
  `user_id` int(20) NOT NULL,
  `shipping_address` varchar(100) NOT NULL,
  `billing_address` varchar(100) NOT NULL,
  `reference` varchar(255) NOT NULL,
  `is_complete` varchar(10) NOT NULL DEFAULT 'No'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `sales_invoice`
  ADD PRIMARY KEY (`invoice_id`);
ALTER TABLE `sales_invoice`
  MODIFY `invoice_id` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;  

  INSERT INTO `sales_invoice` (`invoice_id`, `invoice_no`, `order_id`, `customer`, `contact_person`, `validity`, `payment`, `date_invoiced`, `status`, `user_id`, `shipping_address`, `billing_address`, `reference`, `is_complete`) VALUES
(1, 'INV-201903-2110', 'SO006', 91, 6, 5, 'Immediate', '2019-03-19', 'Paid', 1, '1', 'Company123', 'Webmail', 'No'),
(2, 'INV-201903-2111', 'SO007', 136, 4, 0, 'Immediate', '2019-03-30', 'Open', 1, '1', 'Company456', 'Google mail', 'No');

【问题讨论】:

  • 这个表是多余的。财政年度总是从 4 月 1 日开始。存储这个事实是没有意义的。
  • 是的。我会改变/删除它。但我的问题是我如何准确地增加发票编号然后重置它。
  • 在发票表中,我有 invoice_no (INV-201803-2111),当它到达 2019 年 3 月 31 日时,它应该是 INV-201904-0001 自动而不是 INV-201803-2112 。这部分我不知道怎么做
  • 我之前提到过但错过了这个例子,现在我已经编辑了问题
  • 非常抱歉。在这里,我添加了架构。 [链接]sqlfiddle.com/#!9/e772a4/1

标签: php mysql


【解决方案1】:

考虑以下几点:

DROP TABLE IF EXISTS sales_invoice;

CREATE TABLE sales_invoice 
(invoice_id SERIAL PRIMARY KEY
,invoice_no VARCHAR(50) NOT NULL UNIQUE
,date_invoiced date NOT NULL
);

SET @dt = CURDATE();
-- SET @dt = '2019-03-15';


INSERT INTO sales_invoice (invoice_no,date_invoiced)
SELECT CONCAT_WS( '-'
                , 'INV'
                , DATE_FORMAT(@dt,'%Y%m')
                , COALESCE(LPAD(
                      CASE WHEN @dt > DATE_FORMAT(@dt,'%Y-04-01') 
                           THEN SUM(date_invoiced >  DATE_FORMAT(@dt,'%Y-04-01')) 
                           ELSE SUM(date_invoiced BETWEEN DATE_FORMAT(@dt,'%Y-04-01')-INTERVAL 1 YEAR AND DATE_FORMAT(@dt,'%Y-04-01'))
                      END +1,4,0
                      ),LPAD(1,4,0))
                )
     , @dt FROM sales_invoice;

SELECT * FROM sales_invoice;
+------------+-----------------+---------------+
| invoice_id | invoice_no      | date_invoiced |
+------------+-----------------+---------------+
|          1 | INV-201906-0001 | 2019-06-10    |
+------------+-----------------+---------------+

【讨论】:

  • 非常感谢。我在我的 php 代码中使用了它,将 @dt 替换为 CURDATE() ,它按我的意愿工作。谢谢。
猜你喜欢
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多