चालान और ट्रैकिंग उत्पन्न करना


11

हर 2 सप्ताह में, सिस्टम कंपनियों के लिए चालान जनरेट करेगा।

कंपनी को हर महीने 1 और 16 तारीख को चालान प्राप्त होगा। (यह क्रोन जॉब के माध्यम से हर 2 सप्ताह में चलेगा। यह ऑर्डर टेबल के माध्यम से स्कैन करेगा और फिर 'इनवॉइस' टेबल में जोड़ देगा। क्या कोई विकल्प है?)

ordersतालिका में ग्राहकों के आदेशों की सूची है और यह भी इंगित करता है कि यह किस कंपनी का है ( orders.company_id)

invoiceतालिका से आदेश की कुल लागत की गणना ordersमेज।

मैं यह पता लगाने की कोशिश कर रहा हूं कि कैसे उचित चालान ट्रैकिंग डिजाइन किया जाए। किसी समय कंपनी को मुझे फीस भेजनी होगी या कुछ समय बाद मैं उन्हें फीस भेज दूंगा ( invoice.amount)

मुझे निम्नलिखित के साथ चालान ट्रैक करने की आवश्यकता है:

  • जब कंपनी ने मुझे राशि भेजी है
  • मैंने कब कंपनी को राशि भेजी
  • कंपनी से कितनी राशि प्राप्त हुई है
  • मैंने कंपनी को कितनी राशि भेजी
  • क्या मुझे पूरी राशि प्राप्त हुई (यदि नहीं, तो मुझे Db पर अपडेट करने की क्या आवश्यकता है?)
  • चालान स्थिति (चालान भेजा गया, रद्द किया गया, प्राप्त राशि, भेजी गई राशि)

यहाँ डेटाबेस डिज़ाइन है जिसे मैं लेकर आया हूँ:

कंपनी की मेज

mysql> select * from company;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Company A |
|  2 | Company B |
+----+-----------+

ग्राहक मेरी वेबसाइट से एक कंपनी का चयन कर सकते हैं।

आदेश तालिका

mysql> select * from orders;
+----+---------+------------+------------+---------------------+-----------+
| id | user_id | company_id | total_cost | order_date          | status_id |
+----+---------+------------+------------+---------------------+-----------+
|  1 |       5 |          2 |      25.00 | 2012-02-03 23:30:24 |         1 |
|  2 |       7 |          2 |      30.00 | 2012-02-13 18:06:12 |         1 |
+----+---------+------------+------------+---------------------+-----------+

दो ग्राहकों ने कंपनी बी ( orders.company_id = 2) से उत्पादों का ऑर्डर दिया है । मुझे पता है कि आदेश क्षेत्र पर्याप्त नहीं हैं, बस आपके लिए सरलीकृत किया गया है।

आदेश_प्रक्रिया तालिका

mysql> select * from orders_products;
+----+----------+------------+--------------+-------+
| id | order_id | product_id | product_name | cost  |
+----+----------+------------+--------------+-------+
|  1 |        1 |         34 | Chair        | 10.00 |
|  2 |        1 |         25 | TV           | 10.00 |
|  3 |        1 |         27 | Desk         |  2.50 |
|  4 |        1 |         36 | Laptop       |  2.50 |
|  5 |        2 |         75 | PHP Book     | 25.00 |
|  6 |        2 |         74 | MySQL Book   |  5.00 |
+----+----------+------------+--------------+-------+

उत्पादों की सूची जो ग्राहकों ने आदेश दिया है।

चालान तालिका

mysql> select * from invoice;
+----+------------+------------+---------------------+--------+-----------+
| id | company_id | invoice_no | invoice_date        | amount | status_id |
+----+------------+------------+---------------------+--------+-----------+
|  7 |          2 |        123 | 2012-02-16 23:59:59 |  55.00 |         1 |
+----+------------+------------+---------------------+--------+-----------+

यह वह जगह है जहां मैं इनवॉइस टेबल डिज़ाइन पर काफी अटक गया हूं। मुझे यकीन नहीं है कि यह कैसे किया जाना चाहिए। हर 2 हफ्ते में चालान बनेंगे। परिणाम उदाहरण invoice.amountसे 55.00 है क्योंकि यह orders.company_id = 2तालिका से गणना की गई है

यदि invoice.amount-50.00 (माइनस) है, तो इसका मतलब है कि कंपनी को मुझे फीस राशि भेजनी होगी।

यदि invoice.amount50.00 है, तो इसका मतलब है कि मुझे कंपनी को शुल्क भेजने की आवश्यकता है।

Status_id हो सकता है: (1) चालान भेजा गया, (2) रद्द, (3) पूरा हुआ

क्या मुझे तालिका invoice_idमें फ़ील्ड जोड़ने की आवश्यकता है orders? orders.invoice_idजब पंक्ति को 'इनवॉइस' तालिका में डाला गया है तो फ़ील्ड को अपडेट करें ।

इनवॉइस_पेमेंट टेबल

mysql> select * from invoice_payment;
+----+------------+-----------------+-------------+---------------------+---------------------+
| id | invoice_id | amount_received | amount_sent | date_received       | date_sent           |
+----+------------+-----------------+-------------+---------------------+---------------------+
|  1 |          1 |            0.00 |       55.00 | 0000-00-00 00:00:00 | 2012-02-18 22:20:53 |
+----+------------+-----------------+-------------+---------------------+---------------------+

यह वह जगह है जहां मैं लेनदेन को ट्रैक और अपडेट कर सकता हूं .. भुगतान बीएसीएस के माध्यम से किया जाएगा।

क्या यह अच्छा टेबल डिज़ाइन है या मुझे क्या सुधार करने की आवश्यकता है? मुझे किन क्षेत्रों और तालिकाओं को जोड़ना चाहिए?

यदि इनवॉइस उत्पन्न किया गया है और बाद में मुझे परिवर्तन orders_productsया ordersतालिकाओं में बदलाव करने की आवश्यकता है - तो क्या यह invoice.amountक्षेत्र को पुनर्गणना करना चाहिए ? (मैं PHP / MySQL का उपयोग करूंगा)।

SQL डंप :

CREATE TABLE IF NOT EXISTS `company` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `company` (`id`, `name`) VALUES
(1, 'Company A'),
(2, 'Company B');

CREATE TABLE IF NOT EXISTS `invoice` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `company_id` int(11) NOT NULL,
  `invoice_no` int(11) NOT NULL,
  `invoice_date` datetime NOT NULL,
  `amount` decimal(6,2) NOT NULL,
  `status_id` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;


INSERT INTO `invoice` (`id`, `company_id`, `invoice_no`, `invoice_date`, `amount`, `status_id`) VALUES
(7, 2, 123, '2012-02-16 23:59:59', '55.00', 1);


CREATE TABLE IF NOT EXISTS `invoice_payment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `invoice_id` int(11) NOT NULL,
  `amount_received` decimal(6,2) NOT NULL,
  `amount_sent` decimal(6,2) NOT NULL,
  `date_received` datetime NOT NULL,
  `date_sent` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

INSERT INTO `invoice_payment` (`id`, `invoice_id`, `amount_received`, `amount_sent`, `date_received`, `date_sent`) VALUES
(1, 1, '0.00', '55.00', '0000-00-00 00:00:00', '2012-02-18 22:20:53');


CREATE TABLE IF NOT EXISTS `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `company_id` int(11) NOT NULL,
  `total_cost` decimal(6,2) NOT NULL,
  `order_date` datetime NOT NULL,
  `status_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


INSERT INTO `orders` (`id`, `user_id`, `company_id`, `total_cost`, `order_date`, `status_id`) VALUES
(1, 5, 2, '25.00', '2012-02-03 23:30:24', 1),
(2, 7, 2, '30.00', '2012-02-13 18:06:12', 1);


CREATE TABLE IF NOT EXISTS `orders_products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `product_name` varchar(100) NOT NULL,
  `cost` decimal(6,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

INSERT INTO `orders_products` (`id`, `order_id`, `product_id`, `product_name`, `cost`) VALUES
(1, 1, 34, 'Chair', '10.00'),
(2, 1, 25, 'TV', '10.00'),
(3, 1, 27, 'Desk', '2.50'),
(4, 1, 36, 'Laptop', '2.50'),
(5, 2, 75, 'PHP Book', '25.00'),
(6, 2, 74, 'MySQL Book', '5.00');

बेझिझक आप यहाँ जवाब देने के लिए तालिकाएँ अद्यतन / जोड़ना चाहते हैं।

धन्यवाद

जवाबों:


8

नकद मिलान

यह एक कैश मैचिंग समस्या है। आप इसे दो स्तरों में से एक पर ट्रैक कर सकते हैं:

  • इनवॉइस को नगदी के आंकड़ों से तुलना करें (कुछ टेढ़ा है लेकिन यह वास्तव में है कि यह कैसे लॉयड्स सिंडिकेट्स द्वारा इनवर्ड बिजनेस के लिए किया जाता है, जिसे अक्सर 'लिखित बनाम हस्ताक्षरित रिपोर्ट' कहा जाता है)।

  • चालान से टूटे नकद भुगतान से स्पष्ट नकदी आवंटन बनाए रखें।

आपके प्रश्न से मुझे लगता है कि आप उत्तरार्द्ध करना चाहते हैं।

आमतौर पर यह नकद लेनदेन का एक अलग सेट और चालान करने के लिए नकद भुगतान का आवंटन करने वाली एक ब्रिजिंग तालिका होती है। यदि मान समान हैं या नकद भुगतान एकल चालान संदर्भ के साथ आता है तो आप आवंटन स्वचालित रूप से कर सकते हैं। यदि कोई M: इनवॉइस और भुगतानों के बीच M संबंध है, तो आपको एक मैन्युअल मिलान प्रक्रिया करने की आवश्यकता होगी (यह स्वचालित रूप से करना वास्तव में एक समस्या का संस्करण है )।

एक बुनियादी नकद मिलान प्रणाली

कल्पना करें कि आपके पास एक चालान तालिका, एक नकद भुगतान तालिका और एक आवंटन तालिका है। जब आप एक चालान जारी करते हैं तो आप चालान तालिका में एक चालान रिकॉर्ड और आवंटन तालिका में एक 'प्राप्य' या 'देय' रिकॉर्ड स्थापित करते हैं।

  • चालान # 1, $ 100

  • आवंटन: चालान # 1, 'प्राप्य' लेनदेन प्रकार और $ 100 बकाया के संदर्भ में एक रिकॉर्ड। इस रिकॉर्ड पर नकद भुगतान का कोई संदर्भ नहीं है।

अब, आपको $ 100 का नकद भुगतान मिलेगा

  • नकद भुगतान (chq # 12345): $ 100

  • आवंटन: चालान # 1 और chq # 12345, 'नकद' लेनदेन प्रकार और -100 बकाया ($ 100 भुगतान) के संदर्भ में एक रिकॉर्ड।

आप इसे M: M संबंध में सामान्य कर सकते हैं, जहां आपको एकल चालान या एकाधिक चालान को कवर करने वाले भुगतान के विरुद्ध कई भुगतान मिलते हैं। यह संरचना क्रेडिट नियंत्रण रिपोर्ट बनाने में भी काफी आसान है। रिपोर्ट में 180 दिनों से अधिक पुराने (इनवॉइस) को खोजने की जरूरत है जो अभी भी बकाया है।

यहां स्कीमा प्लस के कुछ उदाहरण और वृद्ध ऋण क्वेरी का उदाहरण दिया गया है। दुर्भाग्य से मेरे पास हाथ से चलने वाली mysql आवृत्ति नहीं है, इसलिए यह SQL सर्वर के लिए है।

-- ==============================================================
-- === CashMatch.sql ============================================
-- ==============================================================
--


-- === Invoices =================================================
--
create table Invoice (
       InvoiceID        int identity (1,1) not null
      ,InvoiceRef       varchar (20)
      ,Amount           money
      ,InvoiceDate      datetime
)
go

alter table Invoice
  add constraint PK_Invoice 
      primary key nonclustered (InvoiceID)
go


-- === Cash Payments ============================================
--
create table CashPayment (
       CashPaymentID    int identity (1,1) not null
      ,CashPaymentRef   varchar (20)
      ,Amount           money
      ,PaidDate         datetime
)
go

alter table CashPayment
  add constraint PK_CashPayment
      primary key nonclustered (CashPaymentID)
go




-- === Allocations ==============================================
--
create table Allocation (
       AllocationID       int identity (1,1) not null
      ,CashPaymentID      int  -- Note that some records are not
      ,InvoiceID          int  -- on one side.
      ,AllocatedAmount    money
      ,AllocationType     varchar (20)
      ,TransactionDate    datetime
)
go

alter table Allocation
  add constraint PK_Allocation
      primary key nonclustered (AllocationID)
go


-- ==============================================================
-- === Scenarios ================================================
-- ==============================================================
--
declare @Invoice1ID int
       ,@Invoice2ID int
       ,@PaymentID int


-- === Raise a new invoice ======================================
--
insert Invoice (InvoiceRef, Amount, InvoiceDate)
values ('001', 100, '2012-01-01')

set @Invoice1ID = @@identity

insert Allocation (
       InvoiceID
      ,AllocatedAmount
      ,TransactionDate
      ,AllocationType
) values (@Invoice1ID, 100, '2012-01-01', 'receivable')


-- === Receive a payment ========================================
--
insert CashPayment (CashPaymentRef, Amount, PaidDate)
values ('12345', 100, getdate())

set @PaymentID = @@identity

insert Allocation (
       InvoiceID
      ,CashPaymentID
      ,AllocatedAmount
      ,TransactionDate
      ,AllocationType
) values (@Invoice1ID, @PaymentID, -100, getdate(), 'paid')



-- === Raise two invoices =======================================
--
insert Invoice (InvoiceRef, Amount, InvoiceDate)
values ('002', 75, '2012-01-01')

set @Invoice1ID = @@identity

insert Allocation (
       InvoiceID
      ,AllocatedAmount
      ,TransactionDate
      ,AllocationType
) values (@Invoice1ID, 75, '2012-01-01', 'receivable')


insert Invoice (InvoiceRef, Amount, InvoiceDate)
values ('003', 75, '2012-01-01')

set @Invoice2ID = @@identity

insert Allocation (
       InvoiceID
      ,AllocatedAmount
      ,TransactionDate
      ,AllocationType
) values (@Invoice2ID, 75, '2012-01-01', 'receivable')


-- === Receive a payment ========================================
-- The payment covers one invoice in full and part of the other.
--
insert CashPayment (CashPaymentRef, Amount, PaidDate)
values ('23456', 120, getdate()) 

set @PaymentID = @@identity

insert Allocation (
       InvoiceID
      ,CashPaymentID
      ,AllocatedAmount
      ,TransactionDate
      ,AllocationType
) values (@Invoice1ID, @PaymentID, -75, getdate(), 'paid')

insert Allocation (
       InvoiceID
      ,CashPaymentID
      ,AllocatedAmount
      ,TransactionDate
      ,AllocationType
) values (@Invoice2ID, @PaymentID, -45, getdate(), 'paid')



-- === Aged debt report ========================================
--
select i.InvoiceRef
      ,sum (a.AllocatedAmount)                 as Owing
      ,datediff (dd, i.InvoiceDate, getdate()) as Age
  from Invoice i
  join Allocation a
    on a.InvoiceID = i.InvoiceID
 group by i.InvoiceRef
         ,datediff (dd, i.InvoiceDate, getdate())
having sum (a.AllocatedAmount) > 0

मेरा चालान और भुगतान के लिए अलग-अलग टेबल हैं। आप आंतरिक लिंकेज के साथ एक सामान्य तालिका का उपयोग कर सकते हैं। नकद मिलान को अक्सर लेखांकन प्रणालियों में उस तरह से लागू किया जाता है।
कंसर्नडऑफटुनब्रिजवेल्स

मैं MySQL में अपने SQL सर्वर उदाहरण का अनुवाद करने में कामयाब रहा। मैं गुजर गया और मैं अब अच्छी तरह से समझ गया था। AllocationTypeयदि मैं ग्राहक के पैसे भेजना चाहूँ तो क्या होगा ? क्या मुझे CashPaymentतालिका में सम्मिलित करने की आवश्यकता है (BACS के माध्यम से भुगतान करते हैं)?
मैं

1
हाँ, आप आवक और जावक भुगतान दोनों के लिए नकद भुगतान रिकॉर्ड चाहते हैं। नकद मिलान लेनदेन के लिए वास्तविक लेनदेन प्रकार आपके ऊपर हैं।
कंसर्नडऑफटुनब्रिजवेल्स

1
यदि आप चाहें तो एकल भुगतान के खिलाफ दोनों दिशाओं में चालान से लेनदेन का मिलान कर सकते हैं। उदाहरण के लिए: $ 100 के लिए जावक इनवॉइस, $ 50 (-50) के लिए इनकमिंग इनवॉइस और $ 50 के लिए आने वाले भुगतान संतुलन दोनों चालान के खिलाफ मेल खाते हैं।
कंसर्नडऑफटुनब्रिजवेल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.